Ruby on Rails の3.2あたりからついていけない気がしていたので、知識を更新するためにパーフェクト Ruby on Railsを読んでいる。知らなかった話がたくさんあったので自分のためにメモ。
config/secrets.yml
p. 173 Rails 4から秘密の文字列はsecrets.ymlで一括管理するようになった。
ハッシュのキーとバリューの表現
Ruby 2.0以前
hash = { :key => "value", :key2 => "value2"}
Ruby 2.0以後。
hash = { key: "value", key2: "value2"}
Rubyにおける式の真偽値(変数初期化のイディオム)
Rubyにおける式の真偽値はbool値と一致していない。
- 真とみなされる場合:偽でない場合
- 偽とみなされる場合: false か nil
論理演算子(||や&&)は左から順番に処理され、式の真偽が決定した段階で処理を終える。
var || "Ruby"
という式の判定は以下のように進む。
- 論理演算子が || なので、部分式が真になった段階で全体の式の真偽が決定する。このため、部分式が真になったら処理終了
- varがnil あるいは false でないならば、式全体が真なので式全体の値はvar
- varがnil あるいは false ならば、部分式"Ruby"の判定に進み、"Ruby"はnilあるいはfalseでないから真。式全体の値は "Ruby"
なので、変数varがnilの場合は変数nameに"Ruby"を代入し、そうでなければvarを代入するという以下の文
name = "Ruby" if var != nil name = var end
これを以下のように書くことができる。そして、これは変数のデフォルト値を与える方法として良く使われている。
name = var || "Ruby"
変数aryが配列として使われている場合は、ary[0]を変数itemに代入するというときの処理
item = nil if ary item = ary[0] end
これは以下のように1行でかける
item = ary && ary[0]
返り値として変数が空でなければtrueを返すとき
上の応用。以下の書き方だとsession[:user_id]がnilの時にはnilを、そうでないときにはsession[:user_id]に格納されている値を返す。
def hogehoge session[:user_id] end
変数が空でなければ返り値としてtrueを返したいとき、以下のように書くことができる。
def hogehoge !!session[:user_id] end
バリデーション時のエラーメッセージの格納など ActiveModel::Errors
app/models/user.rb において、エラーメッセージを追加したいとき
errors.add << "エラーメッセージ"
それをviewで表示させるとき。
<% @user.errors.full_messages.each do | msg | %> <%= msg %> <% end %>
親オブジェクトの外部参照キー込みで生成する build
日付入力フォームのヘルパー Action View Date Helpers
親オブジェクトが削除されたら子オブジェクトも削除される ( dependent: :destroy)
p. 215 eventモデルが親でticketモデルが子のとき、あるeventオブジェクトが削除されたら、それにともないticketオブジェクトも削除されるようにする。app/models/event.rbにて以下のようにdependent: :destroyを付け加える。
has_many :tickets, dependent: :destroy
dependent: :destroyで子オブジェクトのdestroyを自動呼び出し、dependent: :delete_all はdestroy経由でなく直接削除。