我尝试使用强参数从嵌套表单创建记录及其关联记录。我的主要模型是:
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命令。实际上,最终解决这个问题的只是更新所有没有固定版本号的宝石。上帝只知道为什么事情不能与之前的宝石一起工作。对不起,这不是很有帮助......
答案 0 :(得分:0)
<强>存在强>
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存在嵌套表单和强参数的问题。