【问题标题】:Assign relation id to record on create, but not on update将关系 ID 分配给创建时的记录,而不是更新时的记录
【发布时间】:2013-11-05 17:29:00
【问题描述】:

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

非常感谢您的帮助。

【问题讨论】:

  • 在 ... 中包裹隐藏字段标签。有没有更好的 Railsier 方法来做到这一点?
  • params.try(:[], :page_id)
  • 无包装使用内联&lt;%= f.hidden_field(:page_id, :value =&gt; params["page_id"]) if params.has_key?(:page_id)%&gt;
  • Railsier 的方式是使用嵌套资源(例如 /pages/1/sections/new)。你的第三个模型有什么困难?您当前的方法似乎允许在创建部分时出现某种中断的工作流程。当用户返回编辑并且 page_id 不在参数中时会发生什么?他们会创建一个孤立的部分吗?这可以接受吗?
  • 问题是每个部分都有很多块。 Rails 指南建议不要将嵌套资源用于两个以上的级别。您所说的工作流程中断就是我问这个问题的原因;我正在寻找一种仅在创建时分配 page_id 的方法。

标签: ruby-on-rails ruby relationship


【解决方案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,我假设它们都有)。


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

【讨论】:

  • 非常感谢。对我来说,学习 Rails 最难的部分是试图找出这些最佳实践。你能推荐一些书籍或其他资源来解释遵循这些原则的 Rails 技术吗?
  • 我有点偏离轨道循环,但the official guides 总是有帮助的。似乎有一些有希望的信息collated here。学习 Rails 下的两本电子书由社区中一些知名人士(和 Rails 源代码贡献者)编写,看起来很有前途。
  • 这里不想太过时,但我认为 Hartl 教程很棒——你认为问题是什么?
  • 哈哈我删除了它,因为我意识到我真的没有任何正当理由。我唯一的理由是,我已经看到大约 50 个 SO 问题来自遇到问题的人,但很可能这些问题是 PEBCAK 并且与教程无关。
猜你喜欢
  • 1970-01-01
  • 2020-09-20
  • 2023-01-12
  • 2012-07-25
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
相关资源
最近更新 更多