我有两个模型:页面有很多部分。我没有使用嵌套资源,因为还有第三个模型。在我的页面#show中,我有一个链接来创建一个属于当前页面的新部分:
<%= link_to 'New Section', new_section_path(:page_id => @page) %>
在我的剖面视图中,我有:
<%= form_for(@section) do |f| %>
.
.
.
<div class="field">
<%= f.label :title %><br />
<%= f.text_field :title %>
</div>
<%= f.hidden_field :page_id, :value => params["page_id"] %>
<div class="actions">
<%= f.submit %>
</div>
问题当然是,这会正确地将page_id传递到新的Section表单中,但是当用户通过编辑路径返回到表单时,params [“page_id”]为空。我想在创建时设置一次page_id,并且永远不要让它再次被更改(也许有一种方法可以创建一个从表单中删除隐藏字段的条件,或者更清晰的方式?)。
非常感谢你的帮助。
答案 0 :(得分:1)
您不希望从参数中获取page_id
,而是从资源获取。您可以通过将页面ID分配给控制器中的新资源来完成此操作。
在您的控制器中:
def new
# In reality you might create the new Section differently,
# but you get the idea.
#
# In other scenarios the page_id might come from the parent
# (in a nested route) or some other source not determined by
# params.
@section = Section.new(page_id: params[:page_id])
end
然后在您的模板中,让page_id
自然填充:
<%= f.hidden_field :page_id %>
编辑表单已经可以使用,因为记录已经有page_id
(只要所有部分都有页面标识,我认为它们就是这样)。
附注:作为一般规则,您希望避免在视图中使用请求参数,因为这是各种关注点(控制器&lt; - &gt;视图)并且将导致脆弱性和&amp;其他问题(如你所见)。相反,让控制器进行资源收集并将它们分配给模板变量或者你有什么。