为什么rails不使用强参数从嵌套表单创建关联的记录/对象?

时间:2015-03-23 15:00:14

标签: ruby-on-rails nested-forms strong-parameters

我尝试使用强参数从嵌套表单创建记录及其关联记录。我的主要模型是:

class MaterialDonationRequest < ActiveRecord::Base
  has_many :donation_items, dependent: :destroy
  accepts_nested_attributes_for :donation_items, allow_destroy: true
  validates :name, presence: true

  attr_accessor :due_on_event, :date, :donation_items_attributes, :event_id
end

我的关联(嵌套)模型是:

class DonationItem < ActiveRecord::Base
  validates :name, presence: true
  belongs_to :material_donation_request
  belongs_to :global_profile

  validates :name, presence: true
  attr_accessor :_destroy
end

在我的material_donation_requests_controller.rb中,我有以下强参数:

    def material_donation_request_params
      params.require(:material_donation_request).permit(:name, :description, :event_flag, :due_on_event, :date, :event_id, donation_items_attributes: [:id, :name, :description, :amount, :_destroy])
    end

这是我在create方法中创建对象的行:

    @material_donation_request = MaterialDonationRequest.new(material_donation_request_params)

执行此操作后,将从表单中正确创建并填充@material_donation_request。但是相关的donation_items不会被创建。例如,在调试器中,当我输入@material_donation_request.donation_items.first时,Rails返回nil

供参考,以下是Rails在我正在运行的手动测试中为material_donation_request_params返回的内容:

{"name"=>"Name", "description"=>"", "due_on_event"=>"true", "date"=>"", "donation_items_attributes"=>{"0"=>{"name"=>"", "amount"=>"1", "_destroy"=>""}, "1427122183210"=>{"name"=>"", "amount"=>"2", "_destroy"=>""}}}

为什么还没有Rails从表单创建关联对象?在我看过的任何地方,似乎这个结构应该创建所有内容,后续保存应该保存所有内容(或者至少抛出验证错误,如下所示 - 请参阅下面的更新)。我有什么遗失的吗?

更新

由于它是在答案中提出的,是的,上面显示的material_donation_params不会通过验证。这是我手动测试的情景。它应该在保存时生成验证错误,而只是保存MaterialDonationRequest没有任何错误,并且不会向DonationItems保存任何内容。

很明显,如果我完全填写表格并获得以下material_donation_request_params

{"name"=>"Name", "description"=>"", "due_on_event"=>"true", "date"=>"", "donation_items_attributes"=>{"0"=>{"name"=>"first", "amount"=>"1", "_destroy"=>""}, "1427122183210"=>{"name"=>"second", "amount"=>"2", "_destroy"=>""}}}

然后执行@material_donation_request.save,它只保存MaterialDonationRequest,而不保存任何DonationItems

最终更新

好。我删除了之前的最终更新&#34;因为我写的和我在一些评论中所写的内容是错误的。最终解决这个问题的不是Rails 4.1.8的更新。在使用新的Rails版本实际保存gem文件之前,我运行了bundle update命令。实际上,最终解决这个问题的只是更新所有没有固定版本号的宝石。上帝只知道为什么事情不能与之前的宝石一起工作。对不起,这不是很有帮助......

2 个答案:

答案 0 :(得分:0)

来自Rails Validations guide

<强>存在 This helper validates that the specified attributes are not empty. It uses the blank? method to check if the value is either nil or a blank string, that is, a string that is either empty or consists of whitespace.

您需要donation_item才能出现,但是您所产生的参数哈希明确地将捐赠名称留空,验证失败。在调试这些事情时调用save!会很有帮助,因为它会在失败时抛出错误。

答案 1 :(得分:0)

我想出了答案。在绝望中,我将我的Rails版本从4.0.2升级到4.1.8。执行此操作后,没有任何其他更改(当然除了gem依赖项),它只是按照预期的方式开始工作。所以我猜Rails 4.0.2存在嵌套表单和强参数的问题。