おぴよの気まぐれ日記

おぴよの気まぐれ日記

岡山やプログラミング、ファッションのこと、子育てや人生、生き方についての備忘録。

【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の部分は登録・更新したいカラム名です。この例の場合だとnameageがそれにあたります。これらをシンボルを使って記述していきます。

実際の使い方例

実際の使い方ですが、updatecreate処理の時に使います。

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)