Rails rake db:seed のときにだけ Mass-Assignment をスキップしたい

Mass-Assignment 防御のおかげで、デフォルトでは不用意にカラムを更新されないようになって、必要がなければ attr_accessible や attr_protected できちんと許可する属性を制御すべきです。

だがしかし、rake db:seed やテストコード中でまとめてハッシュを渡して new とか create したいじゃないですか。はたまた update_attributes なんかも。

そのためだけに属性を許可しちゃうのも脆弱性の元となりうるし、開けちゃいけない穴まであけたら本末転倒。

という訳で、特定のときだけ accessible を緩くする。

結論

凄く簡単、というか当たり前のこと。

attr_accessible はクラスメソッドなのだから単純に必要なタイミングの直前で呼べばいい。

Model.attr_accessor :name, :gender
Model.new(name: 'el', gender: 'f') # モデルでの実装では許可していない

モデルの中では attr_accessible で許可していないと想定して、new した場合は Can’t mass-assign protected attributes がでますが、直前で accessible にしたのでエラーはでません。

モデルの実装も変えていないので、安全です。

ただし、一度変えちゃうと、実行中は新しく与えた属性許可になっちゃうので、テストコードで思わぬ挙動にならないかということには気をつける。

一回で終わる、検証もおそらくしない db:seed 向きかな。

テストのときは FactoryGirl  や Fabrication をつかえば上手くやってくれているようなので気にしなくてよいみたいです。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする