从父项创建子项的最佳方法是什么?

时间:2012-07-23 13:57:59

标签: ruby-on-rails

作为一名新手,我一直在寻找显示父项目时创建子项目的最佳做法。我找到了许多解释,相当不完整,对我来说并不明显。有人可以描述最佳实践的完整实施吗? 我创建了parent_itemchild_item个模型,包括has_manybelongs_to声明。 我可以在child_items“show”视图中列出已关联的parent_item(手动创建)。

现在我想创建一个<%= link_to 'New Child Item', new_child_item_path %>传递父节点的id作为URL中的参数。 现在走哪条路?

  • 修改路线?
  • 将参数添加到child_item.new控制器?
  • 在child_item表单中有一个隐藏字段,用于存储parent_item.id值?

我很乐意拥抱最好的解释!

谢谢!

佛瑞德


嗨,谢谢你的帮助。当我发现这种嵌套资源功能时,我尝试成功应用它:从父级创建子级时,表单显示已传递给它的parent_id。

以下是我的代码更新:( playground是父级,landscape是孩子)

路线

resources :playgrounds do
  resources :landscapes, :only=>[:new, :create]
end

显示(来自游乐场的父母)

  <%= link_to 'Add landscape', new_playground_landscape_path(@playground) %>

LANDSCAPE_CONTROLLER

def new
  @landscape = Landscape.new
  @landscape.playground_id = params[:playground_id]

FORM (来自风景) - 我不需要参考@playground,因为我只有这种形式的风景字段(我是对的吗?)

<%= form_for [@landscape] do |f| %>
...
  <div class="field">
    <%= f.label :playground_id %><br />
    <%=f.text_field :playground_id%>
  </div>

很好,它运作正常。但playground_id字段不应出现在窗体中,并在landscape.rb模型中定义为不可访问的属性。 这些要求是否兼容? 我可以隐藏这个领域,并让它可以访问吗?

感谢您的帮助!

佛瑞德

1 个答案:

答案 0 :(得分:3)

这听起来像是嵌套资源的明确案例。在那里,您将父资源传递给生成的路径助手。

resources :parents do 
  resources :children
end

在这种情况下,您最终会得到一个类似于

的路径助手
new_parent_child_path(@parent)

在您的子控制器中,父对象将以:parent_id

的形式存在
def show
  @parent = Parent.find(params[:parent_id])
  @child = Child.find(params[:id])
end

您还将使用两种资源创建表单

form_for [@parent, @child] do