Rails 嵌套形式不允许的参数

Rails nested form Unpermitted parameter

当我创建或编辑产品时,由于
,我的merchant_product_detail不会被创建或编辑 不允许的参数:merchant_id。但是其他像id、price都可以传强参数,只有merchant_id不能传。请帮助我,为什么我的 merchant_id 在这种情况下不被允许?

params return binding.pry 模式

"product"=>
      {"name"=>"fewrgvers",
       "description"=>"",
       "product_categories_attributes"=>{"0"=>{"id"=>""}},
       "merchant_product_details_attributes"=>
        {"0"=>{"merchant_id"=>["2"], "id"=>"", "price"=>"123"}}
    "

product_params return

    Unpermitted parameter: merchant_id
    => {"name"=>"fewrgvers",
     "description"=>"",
     "merchant_product_details_attributes"=>{"0"=>{"id"=>"", "price"=>""}}

product.rb

has_many :merchant_product_details
accepts_nested_attributes_for :merchant_product_details, reject_if: proc { |attributes| attributes['merchant_id'].blank? }
has_many :merchants, through: :merchant_product_details

merchant.rb

has_many :merchant_product_details
has_many :products, through: :merchant_product_details
accepts_nested_attributes_for :merchant_product_details

merchant_product_detail.rb

belongs_to :product
belongs_to :merchant

product_controller.rb

 def new
    @product = Product.new
    @product.merchant_product_details.build
end

def create
    @product = Product.new(product_params)
    respond_to do |format|
      if @product.save
        format.html { redirect_to root_path, notice: 'Product was successfully created.' }
      else
        format.html { render :new }
      end
    end
  end
end

def update
    respond_to do |format|
      if @product.update_attributes(product_params)
        format.html { redirect_to root_path, notice: 'Product was successfully updated.' }
      else
        format.html { render :edit }
      end
    end
end


params.require(:product).permit(:name, :description, 
      merchant_product_details_attributes: [:id, :merchant_id, :price]

_form.html.erb

<%= form_for(@product, :url => path, html: { class: "form-horizontal", role: "form" }) do |f| %>
<%= f.fields_for :merchant_product_details do |builder| %>
    <div class="form-group row">
      <%= builder.label :merchant_id, class: "col-md-2 control-label" %>
      <div class="col-md-8">
        <%= builder.select :merchant_id, Merchant.all.collect {|x| [x.name, x.id]}, {include_hidden: false} ,prompt: "Select something", multiple: true, class: "select2" %>
        <%= builder.hidden_field :id %><br>
              <%= builder.label :price %>
        <%= builder.number_field :price %>
      </div>
<% end %>

问题是 merchant_id 的表单域中的 multiple: true。这意味着参数将是一个数组,因为它可以是多个商家 ID。

如果这是您想要的,那么我建议将名称更改为 merchant_ids 并允许这样的数组:

params.require(:product).permit(:name, :description, 
  merchant_product_details_attributes: [:id, :price, merchant_ids: []])

看看你的模型关系,我认为你只想拥有一个 id,在这种情况下,删除 select 中的 multiple: true 就足够了。

<%= builder.select :merchant_id, Merchant.all.collect {|x| [x.name, x.id]}, {include_hidden: false}, prompt: "Select something", class: "select2" %>