Rails4でのデータ保存ではStrong Parametersが使える

Rails4でのデータ保存ではStrong Parametersが使える

みなさんこんにちは、新人の意識高丸です。
初心者向けRuby勉強会「gaienrb」も15回目の参加となりました。
少しずつですが、RubyやRailsについて理解出来てきました。

今回はチュートリアルの第7章をすすめました。
チュートリアルではテストでブラウザの動きをシミュレートするRubyライブラリのCapybaraや、テストデータを生成するFactoryGirlを使っていました。

テストデータの生成については、Fixtureというものがrailsでは標準で用意されていますが、FactoryGirlの方が高機能のようです。
FixtureではYAMLなどでデータを記述しますが、FactoryGirlではRubyのコードで定義するので、保守しにくいFixtureに対して、FactoryGirlは保守しやすいという利点があるようです。

そして、Capybaraでは例えば以下のように記述してテストをシミュレートします。

fill_in “Name”, with: “Example User”
この記述でNameというラベルに関連付けたテキストにExample Userと入力します

click_button “Create my account”
この記述では”Create my account”という見出しのボタンをクリックします

ラベルの値や見出しを見ているところを考えると、ブラウザのシミュレートという言葉がしっくりくる感じがしました。

ユーザがPostした値を保存する場面では、 Strong Parametersを使うことが推奨されていました。
これは、外部から入力されたパラメータに対して、必須のパラメータや許可するパラメータを指定するものです。
以前のRailsではモデル側でattr_accessibleなどをつかって保存可能な項目を指定していましたが、Strong Parametersを使うとコントローラ側で指定できます。
実際には以下のように指定します。

user属性が必須で、name,email,password,password_confirmationの4項目が更新可能ということです。
すごくわかりやすい記述方法だと思いました。
params.require(:user).permit(:name, :email, :password, :password_confirmation)

必須属性が無かったり、許可されたもの以外が入るとエラーが発生するようになっています。
コントローラ側で指定できることで、モデル側ではより再利用しやすく記述できるような気がします。
ちなみにStrong Parametersはrails4からの機能のようです。

そして今回も気になるメソッドを調べてみました。
調べたのはfreezeです。
freezeメソッドは、オブジェクトを変更不可にします。
そして、一度変更不可にしたものはもとに戻すことは出来ません。
freezeしたオブジェクトの破壊的メソッドを実行するとエラーになります。
しかし、オブジェクト自体は変更出来ませんが、変数には代入出来てしまいます。

これの使い道としては、定数をfreezeして変更出来ないようにするくらいしか思いつきませんでした。
試してみたところ、Rubyでは定数に代入することは出来ませんが、破壊的メソッドを実行すると内容が変わってしまうので、定数をfreezeすると、代入も変更も出来ないようになります。

“`定数に破壊的メソッドを使用すると内容が変わる
2.0.0p247 :001 > FRUITS = [‘orange’,’apple’,’grape’]
=> [“orange”, “apple”, “grape”]
2.0.0p247 :002 > FRUITS.pop
=> “grape”
2.0.0p247 :003 > FRUITS
=> [“orange”, “apple”]
“`

“`定数をfreezeすれば変更できない
2.0.0p247 :001 > FRUITS = [‘orange’,’apple’,’grape’].freeze
=> [“orange”, “apple”, “grape”]
2.0.0p247 :002 > FRUITS.pop
RuntimeError: can’t modify frozen Array
from (irb):2:in `pop’
“`

ちなみに、frozen?メソッドでfreezeされているかを調べることが出来ますが、これは使う場面が想像出来ませんでした

TAG

  • このエントリーをはてなブックマークに追加
意識 高丸
エンジニア 意識 高丸 takamaru

Rubyについて日々勉強している新人エンジニアです。初心者向けRuby勉強会のレポートなどを投稿していきます。