35

nested_attributes モデルのすべての属性を許可する強力なパラメーターの方法はありますか? これがサンプルコードです。

class Lever < ActiveRecord::Base
 has_one :lever_benefit
 accepts_nested_attributes_for :lever_benefit
end

class LeverBenefit < ActiveRecord::Base
  # == Schema Information
  #  id          :integer          not null, primary key
  #  lever_id    :integer
  #  explanation :text
end

レバーの強いパラメータについては、現在これを書いています

def lever
 params.require(:lever).permit(:name,:lever_benefit_attributes => [:lever_id, :explanation])
end

andのような属性名を明示的に指定せずに、すべての属性を許可するように記述できるネストされた属性の方法はありますか?lever_idexplanation

:この質問と混同しないでくださいpermit!またはpermit(:all)これは、ネストされた属性のすべてを許可するためのものです

4

6 に答える 6

58

ネストされた params ハッシュで任意のキーを許可することが妥当と思われる唯一の状況は、シリアル化された列に書き込むときです。私はそれを次のように処理することができました:

class Post
  serialize :options, JSON
end

class PostsController < ApplicationController
  ...

  def post_params
    all_options = params.require(:post)[:options].try(:permit!)
    params.require(:post).permit(:title).merge(:options => all_options)
  end
end

try:optionsキーの提示を必要としないことを確認してください。

于 2013-08-16T15:26:21.523 に答える
17

実際には、ネストされたすべてのパラメーターをホワイトリストに登録する方法があります。

params.require(:lever).permit(:name).tap do |whitelisted|
  whitelisted[:lever_benefit_attributes ] = params[:lever][:lever_benefit_attributes ]
end

この方法は、他のソリューションよりも優れています。深くネストされたパラメーターを許可できます。

他のソリューションは次のようになります。

nested_keys = params.require(:lever).fetch(:lever_benefit_attributes, {}).keys
params.require(:lever).permit(:name,:lever_benefit_attributes => nested_keys)

しないでください。


ソース:

https://github.com/rails/rails/issues/9454#issuecomment-14167664

于 2014-09-25T21:02:18.873 に答える