Ruby on rails 在创建时将关系id分配给记录,但在更新时不分配

Ruby on rails 在创建时将关系id分配给记录,但在更新时不分配,ruby-on-rails,ruby,relationship,Ruby On Rails,Ruby,Relationship,我有两个模型:Page有许多部分。我没有使用嵌套资源,因为还有第三个模型。在我的页面#show中,我有一个链接,可以创建属于当前页面的新部分: <%= link_to 'New Section', new_section_path(:page_id => @page) %> @page)%%> 在我的剖面视图中,我有: <%= form_for(@section) do |f| %> . . . <div class="field"> <%

我有两个模型:Page有许多部分。我没有使用嵌套资源,因为还有第三个模型。在我的页面#show中,我有一个链接,可以创建属于当前页面的新部分:

<%= link_to 'New Section', new_section_path(:page_id => @page) %>
@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>

.
.
.

参数[“页面id”]%>
当然,问题是这会将页面id正确地传递到新的节表单中,但是当用户通过编辑路径返回表单时,params[“page_id”]为空。我希望在create上设置一次page_id,并且永远不要再更改它(也许有一种方法可以创建一个从表单中删除隐藏字段的条件,或者更干净的方法?)


非常感谢您的帮助。

您不想从参数中获取
页面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
然后在模板中,让
页面id
自然填充:

<%= f.hidden_field :page_id %>

编辑表单已经可以工作了,因为记录已经有了一个
页面id
(只要所有的部分都有页面id,我假设它们都有)



旁注:一般来说,您希望避免在视图中使用请求参数,因为这是一个问题的混合体(控制器视图),并且会导致脆弱性和其他问题(如您所发现的)。相反,让控制器收集您的资源,并将它们分配给模板变量或您拥有的任何内容。

将隐藏字段标记包装在。。。他正在工作。有更好的Railsie方法吗?或者
params。尝试(:[],:page\u id)
如果params.has\u key,(:page\u id)%>Railsie方法是使用嵌套资源(例如/pages/1/sections/new)。你的第三个模型有什么困难?似乎您当前的方法允许在创建部分时出现某种中断的工作流。当用户返回编辑且页面id不在参数中时会发生什么情况?他们是否创建一个孤立的部分?这可以接受吗?问题是每个部分都有许多块。Rails指南建议不要将嵌套资源用于两个以上的级别。你所说的工作流程中断就是我问这个问题的原因;我正在寻找一种只在创建时分配页面id的方法。非常感谢。对我来说,学习Rails最困难的部分是试图找出这些最佳实践。你能推荐一些书或其他资源来解释遵循这些原则的Rails技术吗?我不太熟悉Rails,但总是很有帮助的。似乎有一些有希望的信息。learning rails下的两本电子书是由社区中一些知名人士(以及rails源代码贡献者)编写的,看起来很有前途。我不想在这里做得太过分,但我认为Hartl教程很棒–你认为问题是什么?哈哈,我删除了它,因为我意识到我真的没有任何正当的理由。我唯一的理由是,我已经看到了大约50个问题,这些问题是人们在阅读过程中遇到的问题,但这些问题很可能与教程无关。