作为一名新手,我一直在寻找显示父项目时创建子项目的最佳做法。我找到了许多解释,相当不完整,对我来说并不明显。有人可以描述最佳实践的完整实施吗?
我创建了parent_item
和child_item
个模型,包括has_many
和belongs_to
声明。
我可以在child_items
“show”视图中列出已关联的parent_item
(手动创建)。
现在我想创建一个<%= link_to 'New Child Item', new_child_item_path %>
传递父节点的id作为URL中的参数。
现在走哪条路?
child_item.new
控制器?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模型中定义为不可访问的属性。 这些要求是否兼容? 我可以隐藏这个领域,并让它可以访问吗?
感谢您的帮助!
佛瑞德
答案 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