1

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

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

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

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

谢谢 !

弗雷德


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

这是我的代码更新:(游乐场是父母,风景是孩子)

路线

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

SHOW(来自游乐场家长)

  <%= 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 模型中被定义为不可访问属性。这些要求是否兼容?我应该隐藏这个字段,让它可以访问吗?

谢谢你的帮助 !

弗雷德

4

1 回答 1

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
于 2012-07-23T14:33:18.870 回答