0

我有两个模型:页面有很多部分。我没有使用嵌套资源,因为还有第三种模型。在我的 page#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 一次,并且永远不要再更改它(也许有一种方法可以创建一个从表单中删除该隐藏字段的条件,或者更简洁的方法?)。

非常感谢你的帮助。

4

1 回答 1

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(只要所有部分都有页面 id,我假设它们有)。


旁注:作为一般规则,您希望避免在视图中使用请求参数,因为这是一个混合问题(控制器 <-> 视图)并且会导致脆弱性和其他问题(如您所见)。相反,让控制器收集您的资源并将它们分配给模板变量或您拥有的东西。

于 2013-11-05T18:14:00.297 回答