Rails:使用相同的部分来创建和编辑嵌套项

时间:2013-05-13 16:04:47

标签: ruby-on-rails edit nested-forms partial

我按照Getting Started With Rails tutorial设置了一个带评论的简单博客。

我把它应用到我自己的场景中:历史项目的历史。在我意识到我需要能够编辑这些历史项目(有点像编辑评论)之前,一切都或多或少都很好。

我已经知道了部分显示历史项目的“编辑项目”链接。它似乎击中了历史项控制器中的编辑操作。但是我得到一个带有空白字段的表单,在按钮上显示“创建”。

显示历史记录项的部分链接:

<%= link_to 'Edit Item', edit_history_history_item_path(history_item.history, history_item) %>

历史记录项控制器中的编辑操作:

def edit
  @history = History.find(params[:history_id])
  @history_item = HistoryItem.find(params[:id])
end

edit.html.rb页面中引用部分内容的部分:

<%= render 'form' %>

部分本身:

<%= form_for([@history, @history.history_items.build]) do |f| %>
  <div class="field">
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </div>
  (blah blah lots more fields)
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

我注意到部分顶部的“@ history.history_items”末尾的.build。我认为这需要创建一个新的历史项目(或博客文章的新评论),它引用了原始历史(或博客文章)。有什么方法可以保留那部分,当它是一个新的历史项目时,但是当我想编辑一个现有项目时,我会采用另一种方式吗?

1 个答案:

答案 0 :(得分:2)

您只需对部分进行一些小改动(见下文)。您应该显式传入history_item,这样您就不必依赖于部分可用的实例变量:

<%= render 'form', history_item: @history_item %>

然后:

<%= form_for([history_item.history, history_item]) do |f| %>
  <div class="field">
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </div>
  (blah blah lots more fields)
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>