よちよち.rbでコントローラーのアクションについて学びました
第13回よちよち.rbに参加しまして、今日は主にControllerの動きを学びましたので、内容を纏めたいと思います。
教材
第2章 デモアプリケーション | Rails チュートリアル 2.2.2 MVCの挙動 あたり
学んだこと
RESTについて
コラム2.2REpresentational State Transfer (REST)のあたりから、RESTという単語が出てきました。
URLによって何をするのか(しているのか)分かりやすくするもの、みたいな感じかなと思いましたが、正直、正体がよく分からなかったです。
よちよちの中でも答えは出ず、名著「Amazon.co.jp: Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus): 山本 陽平: 本」の読書会をしましょうか、という話になりました。
こちらの本は持っているし、一応読んだはずなのですが、、、改めて読みたいと思います。
Controllerの動きについて
リスト2.4 デモアプリケーションのユーザーindexアクションを整理したもの。を見てみると、indexのアクションで定義されているのは、@users = User.all
だけなんですよね。
一方で、図2.11RailsにおけるMVC。を見る限り、Controllerはmodelからデータを取得するだけではなく、Viewを呼び出して、ViewからHTMLを受け取り、そしてFireFoxにHTMLを渡すところまでやっています。
@users = User.all
がmodelからデータを取得する、っていうのは多分そうなんだろうな、と思えますが、Viewにデータを渡してHTMLを受け取るっていうのが、ここに書いてあるとはとても思えない。
となると、継承しているApplicationController
とかに秘密があるのかな、と思って調べてみようと思いましたが、ちゃんと追うことは出来ませんでした。。。。
なので、その疑問をよちよち内でぶつけたところ、
アクションからテンプレートを呼び出す - Ruby on Rails入門
こちらのリンクを紹介して頂きました。
要するに、Railsで何かのアクションが呼ばれた場合、基本デフォルトで「アクション名.html.erb」を読みに行くみたいですね。
(※正確には「.」の前がアクション名と一致していれば良いみたいなので、「.html.erb」でなくても良いみたいですが)
この辺りが噂に聞く、Railsの規約とも関わるのでしょうか。まだ何となくルールが分かっただけなので、引き続き理解を深めていきたいと思います。
その他参考になったこと
リファレンス先
色々継承しているクラスのこととか知りたい時に、何を見るのが適切か、ということでリファレンスを教えていただきました
Ruby on Rails APIリファレンスを見るツール
さらに、色々なリファレンスを見るためのMacのアプリで
Dash for OS X - API Documentation Browser, Snippet Manager - Kapeli
というツールがあるのも教えて頂きました。これは便利!!
YAMLを使って設定値とかをハッシュで使えるようになった話
最近、何気に開いたパーフェクトRubyからYAMLの使い方を学び、その便利さに感動しました。
正直、YAMLを知ってる人にとっては、
「CSVファイルを使ってデータをファイルにしました」ぐらい当たり前の話なんだろうと思いますが、
よく分かっていなかったことは事実なので、纏めていきたいと思います。
YAMLとは
Rubyist Magazine - プログラマーのための YAML 入門 (初級編)
YAML とは、構造化されたデータを表現するためのフォーマットです。 目的は XML と似ていますが、XML と比べて「読みやすい」「書きやすい」「わかりやすい」という利点があります。
何となく分かったような気になって次に進みます。
Rubyでの使い方
るりま library yaml
標準ライブラリでyamlがありますので、
require 'yaml'
で使えるようになるみたいです。
使ってみました
- sample.yml
1 :server1: 2 :id: test1 3 :pw: pass1 4 5 :server2: 6 :id: test2 7 :pw: pass2
ruby側でハッシュのキーがシンボルになるように:sever1:
みたいな書き方にしています
- yaml_test.rb
1 require 'yaml' 2 3 account = YAML.load_file('sample.yml') 4 5 # sever1の情報 6 puts "sever1:" 7 puts account[:server1][:id] 8 puts account[:server1][:pw] 9 10 # server2の情報 11 puts "sever2:" 12 puts account[:server2][:id] 13 puts account[:server2][:pw]
- 実行結果
sever1: test1 pass1 sever2: test2 pass2
- (参考)yamlファイルをロードした結果の中身
[1] pry(main)> require 'yaml' => true [2] pry(main)> YAML.load_file('sample.yml') => {:server1=>{:id=>"test1", :pw=>"pass1"}, :server2=>{:id=>"test2", :pw=>"pass2"}}
ハッシュの値がハッシュという二次元のハッシュになっておりました。
意図通り、キーがシンボルになっております。
良いと思っているところ
恥ずかしながら、今まで接続先サーバのIPアドレスなど種々の設定値をどうやって書くか
全然見当が付いておりませんでした。ベタ書きは駄目だろうなぐらいで。。。
例えば、「サーバーにログインする」ということをやろうと思ったときに
「指定したURLのサーバーにログインするメソッド」(ここは概念的な話です)を作り
login(config[:sever1])
login(config[:sever2])
みたいに書けて、URLとか色々情報の入ったハッシュを、まるっとメソッドに渡し、
メソッド側ではconfig[:url]
みたいに、呼び出し元に関係なく、値がある前提でハッシュを使って粛々と話しを進められます。
あと、新しいサーバーが追加されても、YAMLファイルに書き足せば、基本動くわけですよね。
(上の例だとちょっとはrubyも書かなくてはいけないと思いますが・・・)
すごく便利に使えそうな予感がします!
最後に
Rubyってハッシュ(というかシンボル)がそこら中で使われてることを感じながらも、これまでその有用さをいまいち実感出来ずにいましたが、
YAMLからハッシュを使ってみたことで、おしゃれRubyistに一歩近づけた気持ちになりました。
よちよち.rbでrake routes で出てくる結果について学びました
毎週月曜日、よちよち.rbにて、Rails4のお勉強をしております。
(今はRailsチュートリアルをやってます)
※よちよち.rbについて詳しくは
http://yucato.net/about-yochiyochirb
第11回、第12回のよちよちでrake routesあたりのことを学び、色々勉強になりましたので、その内容を纏めたいと思います。
使った教材
Railsチュートリアルの2.2.2 MVCの挙動
第2章 デモアプリケーション | Rails チュートリアル
学んだこと
リクエストされたURLをさばくのはconfig/routes.rbで書かれた内容に基づく
Railsチュートリアルの図2.11で「Rails router」として描かれている部分。
config/routes.rbの中にresources :users
などと書かれている部分があり、
そこの記載で色々決まるみたいです。routes.rbの中身「resources :users」の意味
resourcesというのはメソッドで、(resources - リファレンス - - Railsドキュメント)
indexとかcreateとか幾つか(よく使う?)アクションへのルーティングを
まとめて定義してくれる便利なもの。
引数の:usersはuserに対する諸々を定義してくださいね、というお願いを(私が)している部分どういう定義がされているのか確認する方法
コマンドラインでrake routes
すると
Prefix Verb URI Pattern Controller#Action 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
みたいな感じで定義を見ることが出来ました。
ここに、ブラウザからどんなリクエストがきたら、どんなアクションを(Rails routerがコントローラーに)お願いするのかが書かれているようです。
rake routesの中身について
resourcesの引数を:usersにしたので、URIとControllerはusersのことになっているのでしょう。
あとはGETとかPOSTとかのhttpのメソッドとURIのパターンで呼び出すアクションが決まるみたいです。
resourcesと書いただけなのに、index〜destroyまで一気に定義されることに感動。resources :usersをもう少し掘り下げてみる
一気に定義される便利さに感動する一方で、定義しないお願いも出来るみたいです。
よちよちで、きたむー先生に教えて頂きました。オプションがあるみたいです。
resources - リファレンス - - Railsドキュメントを見ると
resources :users, :only => [:index]
みたいな感じですかね。
routes.rbを編集した後、rake routes
で
Prefix Verb URI Pattern Controller#Action users GET /users(.:format) users#index
となりました。
この作業を通じて、routes.rbを編集するとビルド的な作業とかすることなく、すぐにrake routesに反映されるのだ、ということも同時に学びました。
- routes.rbをもうちょっと試してみる
書けばすぐに反映されると分かり、失敗してもgitで戻せば良いね、ということもあり
:usersじゃないのを書くとどうなるのだろうか、と。
適当にresources :foo
とか書いてrake routes
Prefix Verb URI Pattern Controller#Action foo_index GET /foo(.:format) foo#index POST /foo(.:format) foo#create new_foo GET /foo/new(.:format) foo#new edit_foo GET /foo/:id/edit(.:format) foo#edit foo GET /foo/:id(.:format) foo#show PATCH /foo/:id(.:format) foo#update PUT /foo/:id(.:format) foo#update DELETE /foo/:id(.:format) foo#destroy
定義されますね。
Controllerは作ってないので、呼び出す先はないのですが、Rails routerは粛々と仕事をするのだということが分かりました。
ちなみに、ゆかおさんからusersみたいに複数形じゃない場合にはfoo_index
みたいにちょっと定義が変化する、と教えて頂きました。
感想
昔、自分でこの辺りの話勉強したときに比べて、よく分かった感が半端なかったです。
(もちろん、まだまだ分からないことだらけですが)
目線の高さが同じぐらいの人たちと学習する楽しさを日々実感してます。