Ruby on Railsチュートリアルに書いてないけど大切なこと

Pocket

Ruby on Railsチュートリアルを一通りやってみて、とても難しいなと感じています。

原因は、覚えなくてはいけないことがあまりに多いこと。Convention over Configurationというコンセプトはいいのですが、構成ファイルより規約をということは、規約を覚えなければソースコードを読むこともできないということです。

チュートリアルでは、丁寧に説明されていますが、それでもわからないと感じたことがあるので調べてみました。

ここでは、わからないことのなかから大切だと思う2つを取り上げます。

ルーティング

RESTfulなインターフェースを一言でいうと、あるアドレスにアクセスするとあら不思議、入力したデータを保存したり変更、削除ができてしまうということです。普段インターネットを見ているには、表示することしかやっていないです。それを拡張したと思えばよいでしょう。

そのようなアドレスと処理するメソッドを結びつけるのがルーティングです。どこにアクセスしたら何をするかを表しています。チュートリアルで勉強してみて、一番大切ではないかと思っています。

Railsがどのようなルーティングを設定しているかを表示するのがrails routesというコマンドです。

rails routes

このコマンドで、次のような表が得られます。

                 Prefix Verb   URI Pattern                             Controller#Action        
    password_resets_new GET    /password_resets/new(.:format)          password_resets#new      
   password_resets_edit GET    /password_resets/edit(.:format)         password_resets#edit     
                   root GET    /                                       static_pages#home        
                   help GET    /help(.:format)                         static_pages#help        
                  about GET    /about(.:format)                        static_pages#about       
                contact GET    /contact(.:format)                      static_pages#contact     
                 signup GET    /signup(.:format)                       users#new                
                        POST   /signup(.:format)                       users#create             
                  login GET    /login(.:format)                        sessions#new             
                        POST   /login(.:format)                        sessions#create          
                 logout DELETE /logout(.:format)                       sessions#destroy         
                  users GET    /users(.:format)                        users#index              
                        POST   /users(.:format)                        users#create             
               new_user GET    /users/new(.:format)                    users#new                
              edit_user GET    /users/:id/edit(.:format)               users#edit               
                   user GET    /users/:id(.:format)                    users#show               
                        PATCH  /users/:id(.:format)                    users#update             
                        PUT    /users/:id(.:format)                    users#update             
                        DELETE /users/:id(.:format)                    users#destroy            
edit_account_activation GET    /account_activations/:id/edit(.:format) account_activations#edit 
        password_resets POST   /password_resets(.:format)              password_resets#create   
     new_password_reset GET    /password_resets/new(.:format)          password_resets#new      
    edit_password_reset GET    /password_resets/:id/edit(.:format)     password_resets#edit     
         password_reset PATCH  /password_resets/:id(.:format)          password_resets#update   
                        PUT    /password_resets/:id(.:format)          password_resets#update   
             microposts POST   /microposts(.:format)                   microposts#create        
              micropost DELETE /microposts/:id(.:format)               microposts#destroy       

どこにアクセスしたら(URI Pattern)、何を呼び出すか(Controller#Action)がわかります。

例えば、/usersにアクセスしたらusers#indexを呼び出します。つまり、users_controller.rbにあるUsersControllerというクラスのindexアクションメソッドを呼び出します。

実はそれだけでなく、プログラムの中でどのようなメソッドや変数が使えるかもここから読み取れます。

Prefixと書いてあるものに、_urlや_pathをつけるとアドレスを表すことができます。上の例では、password_resets_newに_urlをつけて、password_reset_new_urlでhttp://www.example.com/password_resets/newという絶対アドレスになります。_pathをつけて、password_reset_new_pathだと、ホスト名を除いた/password_resets/newという相対アドレスになります。

また、edit_userのところのように:idというアドレスがつくものは、そこに数字が入ることを意味します。たとえば、/users/1というアドレスにアクセスしたら、プログラム上では、params[:id]=1として扱うことができます。

:idに数字が入るということは、アドレスにどのユーザーにアクセスしたいのか指定しなければなりません。そこで、プログラム上でedit_user_pathだけでは不十分で、edit_user_path(@user)というようにユーザーを指定して使うことになります。

VerbのGETやPOSTは、methodの種類です。同じアドレスにアクセスしてもmethodを指定することで違うことができると思えばいいでしょう。

Webアプリケーションは、あるアドレスにアクセスすることですべての動作が始まりますので、ルーティングはとても大切です。この表の読み方だけでも十分理解できると、後の理解の助けになると思います。

変数やアクションメソッドのスコープ

Ruby on Railsチュートリアルをやっていると、いろいろなファイルが出てきて、結局どのファイルでどんな変数やメソッドが使えるのか理解に苦しみました。

簡単にまとめると、ビュー内ではヘルパーすべてが使えます。コントローラー内のメソッドは使えません。

コントローラー内では、application_controller.rbでモジュールをincludeすることでそのコントローラーに関連する以外のヘルパーが使えるようになります。

モデルで定義したクラスは、コントローラー内で使えます。

もう少し詳しく説明します。

まず、app/viewsフォルダの中では、app/helpersの中で定義されたメソッドがすべて使えます。

app/controllers内ではshowやdestroyなどのRESTfulなアクションメソッドを書いて、app/helpers内のヘルパーにそれを補助するメソッドを書くのがいいです。

また、app/controllers内だけで使って他で使わないものは、そのファイルの中でprivate宣言の後に書くといいです。

次に、app/cotrollers内ではapp/controllers/sessions_controller.rbとapp/helpers/sessions_helper.rbのように関連するヘルパーのメソッドは使えます。しかし、関連しないusers_controller.rbからsessions_helper.rbはそのままでは使えません。そのため、app/controllers/application_controller.rb内でinclude SessionsHelperと指定することでcontroller内でsessionに関するメソッドが使えるようになります。

このとき、ファイル名はsessions_helper.rbですが、その中で定義されたモジュール名はSessionsHelperと表記方法が変わっていることに注意してください。

その他には、app/controllers内で@userのようにインスタンス変数を設定すると、それがapp/views内で使えます。app/viewsは通常のRubyのファイルではなく、controllerから呼び出されて使われるものというイメージです。

まとめ

Ruby on Railsチュートリアルをやってみて、あまり説明されていない2つを調べました。ルーティングと変数のスコープを把握しているとプログラム全体の構成がわかりやすくなります。

Railsは、規約が多いのでそれを覚えるだけで大変ですね。でも、重要度にいろいろとあると思うので、大切なものから理解していきたいものです。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください