***本記事にはプロモーションが含まれています。***
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は、規約が多いのでそれを覚えるだけで大変ですね。でも、重要度にいろいろとあると思うので、大切なものから理解していきたいものです。