00:10 – 使用 Run Anything 生成模型。
01:30 – 代码自动补全。
02:35 – Go to definition。
04:06 – 快速文档。
04:36 – 后缀代码补全。
05:22 – RuboCop 集成和意图操作(快速修复)。
08:20 – 显示最近编辑的文件。
09:04 – RegExp 检查器。
09:58 – File Structure 弹出窗口。
10:39 – 代码格式化程序和代码样式选项。
12:10 – 转到相关符号(相关 Rails 实体)。
12:40 – 在编辑器中各方法之间导航。
12:51 – 重构:Extract Method。
14:15 – 重构:Rename。
15:50 – 多个光标。
现在,我们将创建新的模型并向其中添加内容,为您展示 RubyMine 不同的代码编辑功能。为了开始,我会按两次 Control 来打开 Run Anything 操作。这一操作可用于运行任何配置、脚本、命令、Rake 任务、Rails 生成器,以及控制台命令。
我可以先输入类似“rails g model”的内容,或者直接插入“Model”,然后 RubyMine 就会明白我正在寻找一个模型生成器,并在补全列表中提出建议。
我会按 Enter,查看模型生成器的 UI 包装器。它和控制器、迁移和其他生成器中的相同。
我可以在这里提供模型的名称,也就是 Post,及其字段:content: text(现在,如您所见,RubyMine 为字段类型提供了代码数据补全)。其他字段将为“picture: string”。我也可以提供额外选项。我将跳过然后按下 OK。
IDE 将运行生成器,打开 Run 工具窗口,向我展示命令结果,并允许我浏览每个创建的文件。它也会默认在编辑器中打开迁移文件和 post 模型。
关闭 Run 工具窗口,我要向新创建的模型添加一些内容。现在来添加几个关联。首先,通过“belongs_to”关联,让我们的 Post 属于用户。
由于 RubyMine 在每次启动时都会对您的应用程序编制索引,它随后会向您提供许多代码洞察功能,比如在应用程序或 Ruby、Rails 和其他 gem 中声明的类、方法和其他实体的代码自动补全。
这样您就获得了“belongs_to”的自动补全。我们来把它自动补全。我们在找用户模型,而 RubyMine 也很聪明,知道我们要找的是一个模型,所以我们也对它进行自动补全。
示例应用使用 gem carrierwave 上传图片。要将图片与我们的模型关联起来,需要使用这个 gem 中的一个自定义方法,名为“mount_uploader”。如您所见,我们的应用程序安装了这个 gem,RubyMine 建议也自动补全这个方法。
代码自动补全并非 RubyMine 的唯一代码洞察功能。 RubyMine 拥有的最重要能力之一就是可以导航到在应用程序内部或外部声明的任何实体的定义。例如,我们可以快速导航到用户模型的定义。为此,我们将鼠标悬停在模型名称上,然后按 Control 或Command(取决于您的操作系统),然后点击它。
好了,现在我们转到模型,我们也可以在这里添加一个关联。同样,我们可以导航到““belongs_to”关联的定义。现在我们转到活跃记录 gem,文件 associations.rb。让我在 Project 工具窗口中向您展示。
我们现在离开了应用程序和外部库、gem 活跃记录、文件 associations.rb。同样,我们可以导航到这个方法,即 gem carrierwave 或文件 activerecord.rb 等等。
现在来添加一个方法,它将检查图片的大小,在图片过大时显示错误。我们叫它 picture_size:“picture.size > 5.megabytes”。这样好像有了两种相似的方法。如果我不确定该使用哪一个怎么办?我可以按 F1 直接在 IDE 中查看这些方法的快速文档,而不必逐个搜索这些方法或查看文档。
方法 megabytes 返回了相当于提供的兆字节的字节数,这正是我要找的方法。第二个只是第一个的别名,所以用哪一个都可以。
我好像也忘了把它变成 if-statement,但我现在不必回到代码,而只需要插入点 (.) 并键入 if,这样就能用一个 if-statement 来包装这一行:“if picture.size> 5.megabytes”。这项功能叫作“后缀代码补全”,允许您在不返回代码的情况下补充、更改或反转语句。
您可以使用 JavaScript 和 Ruby 在设置中查看所有后缀代码模板的列表。您也可以查看它们的外观,然后根据需要启用和禁用。
好了,我们来完成这个方法。现在让我们重新启用 RuboCop,看看我们的文件中是否有违反代码样式的地方。我们显然有几个问题。要在每一行中查看错误描述,可以转到编辑器的右侧,导航到每个高亮显示处。您也可以将鼠标悬停在高亮显示的文本上并查看错误描述。
最后,如果您不想使用鼠标,还可以直接按 F2 在文件中转到下一个错误,然后只需按 Command+F1 或 Control+F1 就可以看到错误描述。
在这种情况下,问题是我使用了双引号字符串而不是单引号字符串。要使用 RuboCop 修复此问题,我可以按 Alt+Enter 并修复文件中的所有 RuboCop 违规行为,或者按违规类型或由 cop 部门进行修复。我们来修复这个文件中的所有 RuboCop 问题。
太棒了。这个问题消失了,但我们还有几个问题。首先,这里有一个多行语句而不是单行语句。 RuboCop 对此尚无快速修复,但是 RubyMine 可以提供。
再次按下 Alt +Enter 即可访问。如您所见,我们可以将语句转换为修饰符,也就是说,我们可以将这个 if-statement 变成单行语句。按下 Enter 错误就消失了。
不过,根据 RuboCop,我们还剩几个恼人的问题。首先,现在这一行太长了。另一个问题是,我们的类没有文档注释。为了摆脱这些问题,让我们创建一个额外的 RuboCop 配置文件。
我们将转到项目的根目录,创建一个 RuboCop 配置文件 .rubocop.yml。 RubyMine 会询问是否将新文件添加到 Git。我们在这里先按“Yes”,稍后我们再看 VCS 功能。
添加额外规则来摆脱恼人的问题。让我们回到模型。我将手动保存文件以更快地应用更改,然后,RubyMine 会遵从 RuboCop 配置文件,于是这些错误都消失了。
我们看看 RubyMine 还可以为我们做些什么。还有,您可能已经注意到了,好像在我关闭所有文件后,编辑器中打开的文件没有受到影响。要做到这一点,首先将鼠标悬停在标签页上,按住 Alt,然后点击 Close 按钮。这样您就关闭了所有文件,但保留了当前在编辑器中打开的文件。但我也要关闭这个文件,因为接下来不需要它了。我也会关闭 Project 工具窗口。
现在,我想导航到我的用户模型。为此,我可以使用另一个方便的 Recent Files 弹出窗口。根据操作系统,按下 Command+E 或 Control+E 即可。这可以让您导航到最近打开的文件。如您所想,此处也可以进行搜索。所以我可以这样操作,但结果是一个类似的弹出窗口,称为 Recently Edited Files。您应该记得,我们之前确实编辑过用户模型,向模型添加了关联。我们可以从这里打开它。
我们先打磨一下。我们可以在这里摆脱一些 RuboCop 问题。这个例子也可以很好地表现 RubyMine 中意图操作的使用。这个正则表达式用于检查用户是否提供了有效的电子邮箱地址。因此,要检查这个正则表达式,我们可以再次按 Alt+Enter,选择 Check RegExp,并提供一些样本。这个不匹配。这个也不匹配。试试 name@email.com?好。这样就匹配了。太棒了。这就是它的工作原理。
我们也可以用 self 来代替类名,再把这个本该用于多行语句的三元运算符去掉。我们把它变成 if/end-statement。
这里有一个较厚的模型,为了更快地在其方法之间导航,我们可以使用 File Structure 弹出窗口。这个弹出窗口让您能够在文件中的不同方法之间导航,同时支持搜索。我们可以尝试转到一些私有方法,比如这样。
如您所见,我们的私有方法有额外的缩进,默认情况下,RuboCop 认为这违反了代码样式,所以我编辑了配置文件,以消除这种违规。我这样做的原因是,很多开发者其实更喜欢为他们的私有方法和受保护方法添加额外的缩进。
至于代码样式,RubyMine 提供了一个内置的代码格式化程序,它可以根据 Ruby Style Guide 以及可在设置中调整的一些选项来重新设置代码格式。
要重新设置代码格式,可以转到 Code| Reformat Code 或使用快捷键。于是,RubyMine 重新格式化了我们的私有方法,并使其与其他方法一致。
顺便一提,如果您只选择此特定方法并再次按下 Reformat 操作,RubyMine 将仅重新格式化该特定选择。
RubyMine 缩进我们的私有方法的原因是,根据设置现在就应该这么做。所以,如果您转到了设置,请查找 Code Style。我们需要把它分配给 Ruby 语言。但是,结果是针对不同语言和技术的多种代码样式选项。但是在 Ruby 部分,我们可以选择是否要为私有方法和受保护方法添加额外缩进,Preview 窗格也展示了更改后的情况。
还有其他的代码样式选项,例如,您可以在哈希火箭、块中的大括号和哈希以及其他内容周围添加空格。
按下 Apply 并选择 OK。接下来再次重新设置代码格式,现在,RubyMine 为我们的私有方法添加了额外缩进。这就是代码格式化程序在 RubyMine 中的工作方式。
我们再看一看其他与用户相关的内容。为此,我们可以转到 Navigate | Related Symbol…,这将打开一个弹出窗口,显示所有用户相关实体。这里有一个用户 Controller、一个 Helper、一些视图和测试。导航到 Controller。
显然,这里也有一些 RuboCop 问题。我们来一次解决所有问题。这里有一些 Rails 操作。顺便一提,要在不同的操作和方法之间导航,可以使用 Control+⇧ 和 Control+⇩ 或 Alt+⇧ 和 Alt+⇩,具体取决于操作系统。
看起来我们经常为不同的操作做同样的事情。通过 ID 在数据库中找到一个用户,并将其分配给一个实例变量 user。不过,我们何不直接把这段代码直接重构为它自己的方法呢。
为此,我们将转到 Refactor 菜单,然后选择 Refactor 弹出窗口。如您所见,RubyMine 提供了许多不同的重构。例如,您可以提取变量、常量、字段。这些操作都有对应快捷键。我们选择提取 Method 重构。点击它。
我们可以把新的方法变为私有的、公开的、或者受保护的。我们把它变成私有的。再给它取个名字,get_user。点击 OK。
我们将代码重构为其自身方法后,RubyMine 会找到所有使用这一段代码的操作。如果点击“Yes”,即可为每个操作逐一应用新方法,或者为所有操作同时应用。
这样,我们的新方法就被放入私有部分。所有 Rails 操作都使用了新方法而非先前的代码片段。但是,我们在这里仍然有一个小问题。显然,我们不应该给读取器方法加上 get 前缀,因为这违反了代码样式,所以我们要将其重新命名。
我们不必手动操作,因为 RubyMine 同样具有对应重构,叫做 Rename。所以,只要按下 Shift+F6,我们就可以将此方法重新命名,例如 take_user。点击 Refactor。 RubyMine 会找到所有用法,如果我们点击 do refactor,它就会重命名这个方法和它的所有用法。
您可以看到,这个方法现在在所有 Rail 操作中都被称为 take_user。
最后,我们可能不想在多个操作中使用相同的方法。这显然是一个重复,所以我们要做的是为其设置一个筛选器,即前筛选器。
我们转到此处,根据操作系统按下 Command+D 或 Control+D 复制这一行。为这个方法设置前筛选器。现在,如您所见,take_user 也可使用代码补全。
我不记得使用此方法的所有操作,所以我可以再次手动查找它的所有用法。为此,我要按下 Alt+F7。于是,以下操作使用了此操作:edit、followers、following、show 和 update。太棒了。把它们添加进来。
最后,由于有了前筛选器,我们不再需要 take_user 的匹配项,可以将其全部去除。但我们并不需要手动操作。只需要选择一个 take_user 匹配项,然后根据操作系统按下 Control+G 或 Alt+J。
接着不断按下快捷键,直到选中文件中的所有 take_user 匹配项。不过,我们好像也选择了方法 take_user 的定义,但可能并不想把它删除。我们需要取消对它的选择。
为此,我们将使用相同的快捷键,但同时按下 Shift。现在,只需按下 Command+Backspace 即可去除 take_user 方法的所有多余调用。
最后,按 escape 取消多个光标。