2012-07-23 81 views
1

作为一个新手,我一直在寻找最佳实践来创建一个子项目时显示父项目。我找到了很多解释,而不是不完整,对我来说也不明显。有人可以描述最佳实践的完整实施吗? 我创建了parent_itemchild_item型号,包括has_manybelongs_to声明。 我可以在parent_item“show”视图中列出链接child_items(手动创建)。从父项目创建子项目的最佳方法是什么?

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

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

我会很高兴拥抱最好的解释!

谢谢!

弗雷德


您好,感谢您的帮助。当我发现这个嵌套资源功能时,我尝试成功应用它:当从父项创建子项时,表单将与传递给它的parent_id一起显示。

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

ROUTES

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

感谢您的帮助!

Fred

回答

2

这听起来像是嵌套资源的一个明确的例子。在这一点上,你会将你的父资源传递给生成的路径助手。

resources :parents do 
    resources :children 
end 

在这种情况下,你会得到一个路径帮手,看起来像

new_parent_child_path(@parent) 

在你的孩子控制器结束,父对象将在PARAMS作为:parent_id

def show 
    @parent = Parent.find(params[:parent_id]) 
    @child = Child.find(params[:id]) 
end 

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

form_for [@parent, @child] do 
相关问题