【发布时间】:2016-08-19 03:44:13
【问题描述】:
我正在尝试构建一个在一次点击中包含三个关联的对象。如果需要,用户可以选择添加更多子对象。
class Template < ActiveRecord::Base
has_many :stacks, dependent: :destroy
accepts_nested_attributes_for :stacks, allow_destroy: true
end
class Stack < ActiveRecord::Base
belongs_to :template
has_many :boxes, dependent: :destroy
accepts_nested_attributes_for :boxes, allow_destroy: true
end
class Box < ActiveRecord::Base
belongs_to :stack
has_many :template_variables, dependent: :destroy
accepts_nested_attributes_for :template_variables, allow_destroy: true
end
class TemplateVariable < ActiveRecord::Base
belongs_to :box
end
现在我的新模板控制器如下所示:
def new
@template = Template.new
stack = @template.stacks.build
box = stack.boxes.build
box.template_variables.build
end
我遇到了一些障碍,让我认为有更好的方法来做到这一点。 Stack 对象下的对象不会被保存。控制器允许所有正确的参数。
params.require(:template).permit(:name,
stacks_attributes: [:name, :direction, :order, :x, :y, :_destroy],
boxes_attributes: [:name, :_destroy],
template_variables_attributes: [:name, :box_name, :designator, :order_index, :_destroy])
可能是我的表单只是在必要时呈现的部分内容,如下所示:
<%= f.simple_fields_for :stacks do |stack| %>
<%= render 'stack_fields', f: stack %>
<% end %>
<%= link_to_add_fields '+ stack', f, :stacks %>
随后的关系嵌套在其中,就像在stack_fields部分:
<div style='background: #ccc; padding: 1em;'>
<%= f.input :name %>
<%= f.input :direction %>
<%= f.input :order %>
<%= f.input :x %>
<%= f.input :y %>
<%= f.hidden_field :_destroy %>
<%= link_to 'x', '#', class: 'remove_fields' %>
<%= link_to_add_fields '+ box', f, :boxes %>
<%= f.simple_fields_for :boxes do |b| %>
<%= render 'box_fields', f: b %>
<% end %>
</div>
所以我的问题真的是:有没有比像这样上山战斗更好的方法来实现我想要的?比如,也许有一个标准做法或一个 gem 或有助于“深度”对象关系创建的东西?
【问题讨论】:
-
您的表单和对象是嵌套的...但看起来您的许可/要求的嵌套方式不同...您是否看过服务器日志中的参数检查它们是否与您的许可/要求结构相匹配?
-
哦,这是一个很好的观点,这很有意义。我现在将进行快速测试。尽管如此,这确实感觉我正在解决一些可能已经在其他地方以更好的方式解决的问题。 :)
标签: ruby-on-rails ruby ruby-on-rails-4 associations