ruby-on-rails - Accepts_nested_attributes_for 不更新嵌套表

标签 ruby-on-rails

我有2个表cardapios和produtos,当我想更新cardapios的时候,accepts_nested_attributes_for不会更新produtos,并且_destroy =“1”不会删除produto。请按照以下我的代码操作:

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    

下面我们有 update_attributes 之前的 binding.pry 的结果:

[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"}}}

有人可以帮助我吗?

最佳答案

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

关于ruby-on-rails - Accepts_nested_attributes_for 不更新嵌套表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45724357/

相关文章:

ruby-on-rails - 如何在 Rails 4 中将 html 类添加到 I18n 语言环境链接?

ruby-on-rails - 使用 RSpec 测试 Rails 3 respond_with

ruby-on-rails - Heroku 上的 Puma 集群配置

mysql - 如何从我的 Rails 应用程序查询数据库?

mysql - 数据库在测试环境中排序不正确?

ruby-on-rails - 确定 ActiveRecord 在查找过程中是否使用了索引?

ruby-on-rails - 重写属性函数rails mongoid

ruby-on-rails - 在测试期间模拟当前日期

mysql - Active Record 的第一个方法是否按 id 排序?

ruby-on-rails - 有没有办法返回当前登录的设备用户数?