2016-06-16 20 views
0

Wenn ich erstellen oder zu bearbeiten Produkt, wird mein merchant_product_detail nicht wegen
Unzulässige Parameter erstellt oder bearbeitet werden: merchant_id. Aber andere wie ID und Preis sind in der Lage, starke Parameter zu übergeben, nur merchant_id konnte es nicht passieren. Helfen Sie mir bitte, warum meine Merchant_id in diesem Fall nicht erlaubt ist?Rails verschachtelte Form Unzulässige Parameter

params Rückkehr in binding.pry Modus

"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 %> 

Antwort

1

Das Problem ist die multiple: true in das Formularfeld für merchant_id. Dies bedeutet, dass der Parameter ein Array ist, da es mehrere Händler-IDs sein können.

Wenn das ist, was Sie wollen, dann würde ich empfehlen, den Namen zu merchant_ids verändern und ermöglichen ein Array wie folgt aus: obwohl

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

einen Blick auf Ihr Modell Beziehungen zu haben möchte ich glaube, Sie nur eine ID haben In diesem Fall sollte es ausreichen, die multiple: true in der Auswahl zu entfernen.

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

es funktioniert ohne mehrere: wahr, danke! –

Verwandte Themen