パーフェクト Ruby on Rails 6章メモ

Ruby on Rails の3.2あたりからついていけない気がしていたので、知識を更新するためにパーフェクト Ruby on Railsを読んでいる。知らなかった話がたくさんあったので自分のためにメモ。

単体テストを自動生成しない

コントローラーやモデルを生成したときに単体テストを自動生成しない場合は、「-T」をつける。

% rails new app_name -T

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"

という式の判定は以下のように進む。

  1. 論理演算子が || なので、部分式が真になった段階で全体の式の真偽が決定する。このため、部分式が真になったら処理終了
  2. varがnil あるいは false でないならば、式全体が真なので式全体の値はvar
  3. 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

Strong Parameter

Rails 4から標準になったStrong Parameter

日付入力フォームのヘルパー 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経由でなく直接削除。

rescue_from 例外が起こったときに処理

pp. 222-223 いままで知らんかったというのが非常にあかん。