在创建时将关系ID分配给记录,但不在更新时分配

时间:2013-11-05 17:29:01

标签: ruby-on-rails ruby relationship

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

非常感谢你的帮助。

1 个答案:

答案 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;其他问题(如你所见)。相反,让控制器进行资源收集并将它们分配给模板变量或者你有什么。