accept_nested_attributes_for不更新嵌套表

问题描述:

我有2个表cardapios和产品,当我想更新cardapios accept_nested_attributes_for不更新产品和_destroy =“1”不会删除产品。按照波纹管我的代码:accept_nested_attributes_for不更新嵌套表

class Cardapio < ActiveRecord::Base 
    mount_uploader :imagem, CardapioImagemUploader 

    belongs_to :empresa 
    has_many :itens 
    has_many :cardapios_produtos 
    has_many :cardapios_eventos 
    has_and_belongs_to_many :eventos 
    has_and_belongs_to_many :produtos 

    accepts_nested_attributes_for :cardapios_produtos, reject_if: proc { |a| a[:produto_id].blank? or a[:preco].blank? }, allow_destroy: true 

def update 
    authorize @cardapio 
    atualiza_imagem 

    binding.pry 
    if @cardapio.update_attributes(cardapio_params) 
     if params[:parent_controller].present? 
     redirect_to controller: params[:parent_controller], action: params[:parent_action], id: params[:parent_id].to_i, notice: 'Cardapio was successfully updated.' 
     else 
     redirect_to cardapios_path, notice: 'Cardapio was successfully updated.' 
     end 
    else 
     render :edit 
    end 
    end 

def cardapio_params 
    params.require(:cardapio) 
     .permit(
      :nome, :empresa_id, 
      :imagem, :imagem_crop_x, :imagem_crop_y, :imagem_crop_w, :imagem_crop_h, 
      evento_ids: [], 
      cardapios_produtos_attributes: [ 
      :id, :cardapio_id, :produto_id, :preco, :destaque, :_destroy 
      ] 
     ) 
end  

娄我们binding.pry的之前的update_attributes结果:

[1] pry(#<CardapiosController>)> cardapio_params 
=> {"nome"=>"Cardapio BDD Light", 
"empresa_id"=>"3", 
"imagem_crop_x"=>"", 
"imagem_crop_y"=>"", 
"imagem_crop_w"=>"", 
"imagem_crop_h"=>"", 
"evento_ids"=>["", "1"], 
"cardapios_produtos_attributes"=> 
    {"0"=>{"id"=>"4", "produto_id"=>"1", "preco"=>"5", "destaque"=>"0", "_destroy"=>"0"}, 
    "1"=>{"id"=>"5", "produto_id"=>"7", "preco"=>"20", "destaque"=>"1", "_destroy"=>"0"}, 
    "2"=>{"id"=>"22", "produto_id"=>"12", "preco"=>"13.5", "destaque"=>"0", "_destroy"=>"1"}, 
    "3"=>{"produto_id"=>"", "preco"=>"", "destaque"=>"0", "_destroy"=>"0"}, 
    "4"=>{"produto_id"=>"", "preco"=>"", "destaque"=>"0", "_destroy"=>"0"}, 
    "5"=>{"produto_id"=>"", "preco"=>"", "destaque"=>"0", "_destroy"=>"0"}, 
    "6"=>{"produto_id"=>"", "preco"=>"", "destaque"=>"0", "_destroy"=>"0"}, 
    "7"=>{"produto_id"=>"", "preco"=>"", "destaque"=>"0", "_destroy"=>"0"}}} 

有人可以帮我吗?

+0

由于您拥有'cardapios_produtos'连接表,因此''has_and_belongs_to_many'实际上应该是'has_many through'关系。 – urielSilva

我觉得问题出在模型的这个部分has_and_belongs_to_many :produtos。根据此文档http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html
有一对一和一对多。 您应该使用has_manyhas_one