よちよち.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の規約とも関わるのでしょうか。まだ何となくルールが分かっただけなので、引き続き理解を深めていきたいと思います。

その他参考になったこと

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:みたいな書き方にしています

  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みたいにちょっと定義が変化する、と教えて頂きました。

感想

昔、自分でこの辺りの話勉強したときに比べて、よく分かった感が半端なかったです。
(もちろん、まだまだ分からないことだらけですが)
目線の高さが同じぐらいの人たちと学習する楽しさを日々実感してます。