【Rails】不用な値の更新を防ぐ「Strong Parameters」について
Ruby on RailsのStrong Parameters
についての紹介です。
ユーザー登録やお問い合わせなど、ユーザーがフォームに入力したデータのみ登録・更新できるようにするための機能です。
webの場合は開発者ツールなどを使って存在しないformを自由に作ったり出来てしまうので、それを防ぐことは大事です。
基本的な使い方
params.require(:key).permit(filter)
- key: paramsのキー
- filter: 登録・更新を許可するカラム名
<input name="new_user[name]"> <input name="new_user[age]">
key
はinputラベルのname
に指定する名前です。この例の場合だとnew_user
がそれにあたります。
filter
の部分は登録・更新したいカラム名です。この例の場合だとname
やage
がそれにあたります。これらをシンボルを使って記述していきます。
実際の使い方例
実際の使い方ですが、update
やcreate
処理の時に使います。
new_user_params
メソッドがStrong Parameterの処理部分です。
# new_users_controller.rb def create @user = NewUser.new(new_user_params) if @user.save # 成功した時の処理 else # 失敗した時の処理 end end def new_user_params params.require(:new_user).permit(:name, :age, :gender, :birthday) end
このように記述しておく事で万が一別のカラムが飛んで来ても無視されます。
またNewUser.create(params[:new_user])
のようにStrong Parameters記述せずにparamsをそのまま登録しようとするとエラー(ActiveModel::ForbiddenAttributesError)になります。
そのほかの使い方例
関連するデータもまとめて登録する
1 : Nの関係など関連するデータも合わせて登録・更新した時にnested_attributes
という仕組みがあります。こういった場合は以下のように記述する事で関連するデータもまとめて対応する事ができます。
params.require(:new_user).permit(:name, :age, :gender, :birthday, posts_attributes: [:id, :title, :_destroy])
キーが存在しない場合にエラーにならないように
テーブルなどのデータの一覧があって、対象データにチェックを付けてデータの登録・更新するような処理の場合に1つもチェックがない状態で保存するとkey
が無い状態になるのですが、そのような場合に使います。
params.fetch(:new_user, {}).permit(:name, :age, :gender, :birthday)