我正在使用茧宝石尝试实现添加一个对象,该对象属于另一个具有嵌套字段的对象。我有一个“用户解析度”,其中包含许多“里程碑”。我在这两个模型中都相应地设置了关联。由于某些原因,无法创建里程碑,但是,如果我在数据库中手动添加一个里程碑,则可以成功更新它。我能够动态添加字段并使用茧形宝石将其删除,仅此而已。当我单击“添加里程碑”时,它会将我重定向到用户分辨率的显示视图,并抛出成功消息,提示用户分辨率已更新,未引发任何错误,但未创建里程碑。
user_resolution.rb
has_many :milestones
accepts_nested_attributes_for :milestones, reject_if: :all_blank, allow_destroy: true
Milestone.rb
belongs_to :user_resolution
我已经在编辑视图中设置了嵌套表单,因为现在我只希望用户在编辑视图中为解决方案添加里程碑。
user_resolutions / edit.html.erb
<%= form_for(@user_resolution) do |f| %>
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :description %><br>
<%= f.text_area :description %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<%= f.fields_for :milestones do |milestone| %>
<%= render 'milestone_fields', f: milestone %>
<% end %>
<%= link_to_add_association 'Add Milestone', f, :milestones %>
<%= f.submit "Add Milestone" %>
<% end %>
_milestone_fields.html.erb
<div class="nested-fields">
<div class="field-row">
<%= f.label :name, 'Name' %>
<%= f.text_field :name %>
</div>
<div class="field-row">
<%= f.label :description, 'Name' %>
<%= f.text_area :description %>
</div>
<div class="field-row">
<%= f.label :severity, 'severity' %>
<%= f.check_box :severity %>
</div>
<div class="field-row">
<%= f.label :target_date, 'target_date' %>
<%= f.date_select :target_date %>
</div>
<%= link_to_remove_association 'Remove', f %>
</div>
用户分辨率控制器中允许的参数还包含以下内容
milestones_attributes: [:id, :user_resolution_id, :name, :description, :target_date, :severity, :complete, :_destroy]
里程碑本身没有视图,它们只有模型和控制器。控制器的create动作(我不确定嵌套表单是否需要)包含以下标准代码
def create
@milestone = Milestone.new(milestone_params)
if @milestone.save
redirect_to user_resolutions_path,
:flash => { :success => "You successfully created a milestone" }
else
redirect_to new_milestone_path,
:flash => { :error => "Oops something went wrong. Try again." }
end
end
我一直在提供尽可能多的信息,但是如果您需要其他任何信息,请告诉我。谢谢你们。
我不确定嵌套表单是否需要
您不需要执行任何create
操作milestones
-它们将从user_resolutions#create
控制器操作中填充。
有几件事情要看。我会在这里详细说明。这不是一个具体的答案,但可能会帮助您指出正确的方向。
首先,您需要确保接收正确的params。
Cocoon
在构建嵌套表单方面做得非常好-您需要确保它使用Rails的嵌套属性结构。
为此,您应该right-click > view source
。
在该f.fields_for
部分(在HTML中不会称为),您将查找与以下内容等效的内容:
<input type="text" name="milestones_attributes[0][name]" value="">
要注意的重要事项是名称...
每当您使用表单或任何Rails视图帮助器时,您实际上只是在构建标准HTML。form_for
只是创建一个HTML表单,因此其中包含的所有参数都需要遵循一定的结构,Rails才能识别这些参数。
f.fields_for
通常将调用这些元素-将其x_attributes[:id][:param]
传递给Rails,Rails会循环遍历每个元素[:id]
以确定要添加的嵌套参数的数量。
您需要检查上述命名结构的来源。如果您看到它,那很好。如果不是,则表明您尚未正确构建表单。
其次,您需要确保在Controller中构建了对象。
我不确定这样Cocoon
做如何,但是从本质上讲,每次使用时f.fields_for
,您都必须在构建关联对象之前:
def new
@user_reservation = UserReservation.new
@user_reservation.milestones.build #-> this is what makes f.fields_for work
end
如果第一步显示的元素命名不正确,则表明您的关联对象未构建(这就是为什么无法识别它们的原因)。
要对其进行测试,您应该在发送之前在新方法中构建关联对象。
最后,您需要发布params。
这些明确地告诉您Rails对嵌套属性的处理方式,从而使您能够确定它们发生了什么。
很抱歉,答案很长。无论如何,您都不会收到任何答案,因此,给您一些东西是我的明智之举。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句