00:10 – Run Anythingを使ってモデルを生成する。
01:30 – コードの自動補完
02:35 – 定義にジャンプ
04:06 – クイックドキュメント
04:36 – 後置コード補完
05:22 – RuboCop統合と統合アクション(クイックフィックス)
08:20 – 最近のファイル/最近編集されたファイルを表示
09:04 – RegExpチェッカー
09:58 – ファイル構造のポップアップ
10:39 – コードフォーマッタとコードスタイルのオプション
12:10 – 関連するシンボル(関連するRailsエンティティ)にジャンプ
12:40 – エディター内のメソッドのナビゲーション
12:51 – リファクタリング: メソッド抽出
14:15 – リファクタリング: 名前の変更
15:50 – 複数のカーソル
新しいモデルを作成し、RubyMineの様々なコード編集機能を示すコンテンツをそれに追加しましょう。まず、Ctrlキーを2回押して、Run Anythingアクションを開きます。このアクションは、構成、スクリプト、コマンド、Rakeタスク、Railsジェネレータ、そしてコンソールコマンドの実行に使用できます。
「rails g model」や「Model」のように入力し始めると、RubyMineは私がモデルジェネレータを探していると判断し、補完リストにそれを提案します。
Enterキーを押すと、モデルジェネレータのUIラッパーが表示されます。コントローラ、移行、その他のジェネレータについても、同じようになります。
ここには、私のモデルの名前として「Post」を指定します。そしてfields: content: textを指定します(RubyMineはフィールドタイプのコードデータも補完できるようになりました)。他のフィールドは、「picture: string」となります。追加のオプションも指定できますが、それは省略して「OK」を押します。
IDEでジェネレータが実行され、Runツールウィンドウが開いてコマンドの結果が表示されます。ここで、作成されたファイル間を移動することができます。また、デフォルトではマイグレーションファイルと Post モデルがエディターで開きます。
では、Runツールウィンドウを閉じて、新しく作成したモデルにコンテンツを追加していきましょう。まずは、関連付けからです。 「belongs_to」関連付けを使って、Postをユーザーに関連させます。
RubyMineでは、アプリケーションが起動するたびに索引が作成されるため、アプリケーションや、Ruby、Rails、そしてその他のgemで宣言されたクラスやメソッド、そしてその他のエンティティなどに使用できるコード自動補完といった多数のコードインサイト機能を使用することができます。
具体的には、このようにして「belongs_to」の自動補完を表示します。自動補完を適用しましょう。 RubyMineは賢明なので、モデルを探しているのだと判断します。確かにユーザーモデルを探しているため、そのまま自動補完を使用しましょう。
サンプルアプリはgemのcarrierwaveを使って、写真をアップロードします。そこで、写真をモデルに関連付けるために、この「mount_uploader」というgemのカスタムメソッドを使用する必要があります。このgemは、このように、アプリケーション用にインストールされているため、RubyMineはこのメソッドも自動補完するように提案します。
RubyMineに備わっているコードインサイト機能は、コード自動補完だけではなく、最も重要な機能の1つとして、アプリケーションの内外に宣言されているあらゆるエンティティの定義に移動できる機能が挙げられます。たとえば、ユーザーモデルの定義に素早く移動できるのです。モデルの名前にマウスポインターを合わせて、使用しているオペレーティングシステムに応じて、ControlかCommandを押したままクリックすることで、移動することができます。
モデルに移動できたので、ここにも関連付けを追加しましょう。 belongs_to関連付けの定義にも、同じようにして移動できます。 active record gem、「associations.rb」ファイルに移動しました。 Projectツールウィンドウで確認しましょう。
アプリケーションから外れ、外部ライブラリ、active record gem、associations.rbファイルに移動していることを確認できます。また、同じようにして、このcarrierwave gemのメソッド、またはactiverecord.rbファイルのメソッドなどに移動していくことができます。
写真のサイズをチェックし、サイズが大きすぎる場合にエラーを発生させるメソッドを追加しましょう。 picture_size: “picture.size > 5.megabytes” とします。これで、似たようなメソッドが2つ存在するようになりました。どちらを使ってよいのかわからなくなったらどうすればよいのでしょうか。それぞれのメソッドをGoogleやドキュメントで確認するのではなく、F1を押すと、直接IDE内で、メソッドに関するクイックドキュメントを確認することができます。
megabytesメソッドが、指定したメガバイトに等しいバイト数を返すため、これが必要としているメソッドということになります。もう片方のメソッドは最初のメソッドの単なるエイリアスなので、どちらのメソッドでも使用できます。
ifステートメントにするのも忘れていたようです。ただし、コードに戻るのではなく、「.」(ピリオド)の後に「if 」を入力すると、この行を「if picture.size> 5.megabytes」というように、ifステートメントでラップすることができます。これは後置コード補完という機能で、コードに戻らずに、ステートメントを補完、変更、または反転することができます。
後置コードテンプレートの一覧は設定で確認でき、JavaScriptとRuby用に提供されています。また、どのように表示されるかを確認し、必要なものを有効または無効にすることができます。
それでは、メソッドを完成させましょう。 RuboCopをもう一度有効にして、ファイル内にコードスタイル違反がないか確認します。明らかに、課題が2つあります。各行でエラーの説明を確認するには、エディターの右側にジャンプし、ハイライト部分をそれぞれ確認することができます。また、ハイライトされたテキストにマウスポインターを合わせると、そこにエラーの説明が表示されます。
マウスを使用しない場合は、F2キーを使って、ファイル内のエラーを順に確認できます。Command+F1またはControl+F1を押すと、エラーの説明を確認できます。
この特定のケースについて言えば、文字列に引用符の代わりに二重引用符を使用していることが問題となっています。そこで、RuboCopを使って修正する場合、Alt+Enterを押して、ファイル内でRuboCopが検出した問題をすべて修正するか、違反の種類もしくは管轄別に修正することができます。 RuboCopが検出した、このファイルのすべて課題を修正することにしましょう。
完了です。この問題はなくなりましたが、修正が必要な問題はまだいくつか残っています。まずは、単一ではなく複数の行に渡って書かれたステートメントから対処しましょう。残念ながら、RuboCopにはこれを修正できるクイックフィックスはありません。ただし、RubyMineを使って修正することができます。
もう一度Alt +Enterを押して、RubyMineにアクセスしましょう。このように、ステートメントを修飾子に変換できるため、この ifステートメントを1行のステートメントに変換することができます。そしてEnterを押すと、このようにエラーが無くなります。
RuboCopによれば、問題が後2つ残っているようです。 1つ目はこの行が長すぎること、そして2つ目は、クラスのドキュメントコメントが欠落していることです。これらを解消するために、もう1つのRuboCop構成ファイルを作成することにしましょう。
構成ファイルの作成は、プロジェクトのルートで行います、RuboCop構成ファイルの .rubocop.ymlを作成しましょう。 RubyMineから、新しいファイルをGitに追加するかどうか尋ねられるので、とりあえず「Yes」を押しましょう。VCS機能についてはもう少し後で説明します。
2つの面倒な問題を取り除くためのルールを追加しましょう。モデルに戻ります。変更を素早く適用できるように、ファイルを手動で保存します。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に置き換え、数行に渡るステートメントで使用される、この3つ目の演算子を取り除きましょう。 if/endステートメントにしましょう。
ここに長いモデルがあります。この中のメソッドを素早くナビゲートするには、File Structureポップアップを使用できます。このポップアップでは、ファイル内のさまざまなメソッドをナビゲートでき、ここでも検索を使用することができます。では、このようにして、プライベートメソッドにジャンプしてみましょう。
ご覧のとおり、プライベートメソッドに追加のインデントが使用されており、RuboCopはデフォルトでこのコードスタイルを違反とみなします。そこで、この違反を無くすように、構成ファイルを編集しました。プライベートメソッドと保護されたメソッドにインデントを余分に追加する開発者が多いからです。
コードスタイルに関して言えば、RubyMineには、Rubyスタイルガイドと、ユーザーが設定で調整できるオプションに従ってコードを再フォーマットするコードフォーマッタが組み込まれています。
コードのフォーマットを変更するには、Code| Reformat Codeに移動します。ショートカットも使用できます。ご覧のとおり、RubyMineはプライベートメソッドを、他のメソッドと一致するように再フォーマットしました。
ところで、この特定のメソッドのみを選択して、もう一度Reformatを押すと、選択された特定のメソッドのみが再フォーマットされます。
RubyMineがプライベートメソッドにインデントを適用するのは、設定でそのようにすることが指定されているからです。そこで、設定に移動して、Code Styleを探してみましょう。 Ruby言語に関するコードスタイルが必要です。ところが、ほかの言語やテクノロジーのコードスタイルオプションばかりが結果に表示されてしまいます。でも、このRubyセクションでは、プライベートメソッドと保護されたメソッドにインデントを余分に追加するどうかを選択できます。また、何が変更されるかは、Previewペインで確認することができます。
コードスタイルには他のオプションもあります。ハッシュロケット前後のスペースやブロックの波括弧など、様々なオプションを設定できます。
では、Applyに続いてOKを押しましょう。コードのフォーマットをもう一度適用し直すと、プライベートメソッドにインデントが余分に追加されたのがわかります。 RubyMineのコードフォーマッタはこのように動作します。
それでは、ユーザー関連の機能をいくつか見てみましょう。 Navigate | Related Symbol...に移動すると、ユーザー関連のすべてのエンティティが表示されるポップアップが開きます。ユーザーのコントローラ、ヘルパー、ビュー、そしてテストがあります。では、コントロールに移動しましょう。
明らかに、ここにもRuboCopの課題がたくさんあります。これらをまとめて修正しましょう。ここには多数のRailsアクションがあります。因みに、使用しているオペレーティングシステムに応じて、Control+⇧と Control+⇩またはAlt+⇧とAlt+⇩を使って、アクションやメソッド間を移動できます。
さまざまなアクションに対して同じ操作を行うことがほとんどのようです。ユーザーIDを使ってデータベース内のユーザーを検索し、それをインスタンス変数のuserに割り当てます。そのようにする代わりに、この部分のコードを独自のメソッドにリファクタリングしてはどうでしょうか。
まず、Refactorメニューに移動し、Refactor ポップアップを選択しましょう。 RubyMineには、多数のリファクタリングが用意されています。たとえば、変数、定数、フィールドを抽出することができます。どのアクションにもショートカットが割り当てられています。メソッドを抽出リファクタリングを使用してみましょう。クリックします。
新しいメソッドをプライベートメソッドやパブリックメソッド、もしくは保護されたメソッドにすることができます。プライベートメソッドにしてみましょう。そして、 get_userという名前を付けて、 OKをクリックします。
RubyMineは、先ほど独自のメソッドにリファクタリングした、同じコードの部分を使用するすべてのアクションを検索します。 「Yes」をクリックすると、各アクションに1つずつ、またはすべて一括して新しいメソッドを適用できます。
新しいメソッドはプライベートセクションにあります。これです。そしてすべてのRailsアクションは、以前のコードフラグメントではなく、新しいメソッドを使用しています。ただし、ここにはまだ小さな問題があります。明らかに、readerメソッドにgetプレフィックスを使用することはコードスタイルの違反となっているため、別のものに名前を変更する必要があります。
RubyMineには、名前の変更というリファクタリングも用意されているため、手動で名前を変更する必要はありません。 Shift+F6を押すと、この名前を「take_user」などの別の名前に変更できます。 Refactorを押します。 RubyMineはすべての使用箇所を検索するため、do refactorを押すと、見つかったすべての使用箇所のメソッドの名前が変更されます。
このように、すべてのRailsアクションのこのメソッドは、take_userになりました。
同じメソッドを複数のアクションで使用するのはおそらく好ましくないでしょう。明らかに重複です。そこで、これをフィルタにする必要があります。beforeフィルタです。
上にスクロールし、オペレーティングシステムに応じてCommand+D またはControl+Dを押し、この行を複製しましょう。このメソッドをbeforeフィルタにします。このように、コード補完はtake_userで利用できるようになりました。
今回は、このメソッドを使用しているすべてのアクションを覚えていないため、手動で、その使用箇所をもう一度洗い出すことにします。 Alt+F7を押します。すると、edit、followers、following、show、およびupdateアクションがこのアクションを使用していることがわかりました。上出来です。では、追加しましょう。
take_userは、beforeフィルタを作成したので不要となりました。そこで、すべての出現箇所を削除することができます。この作業を手動で行う必要はありません。 take_userの出現箇所を1つだけ選択し、オペレーティングシステムに応じてControl+GまたはAlt+Jを押しましょう。
そして、ファイル内のtake_userの出現箇所がすべて選択されるまで、ショートカットを繰り返し押します。ただし、take_userメソッドの定義も選択してしまいました。これは削除してはいけません。その選択は解除する必要があります。
選択解除は、同じショートカットを使用しますが、Shiftも押します。後は、Command+Backspaceを押すだけで、take_userメソッドの不要な呼び出しがすべて削除されます。
最後に、escapeを押して、複数のカーソルを解除しましょう。