Rails 3 个模型的 5 个嵌套资源?

Rails 5 Nested Resources for 3 models?

我有 3 个模型:

举报

has_many :report_items, dependent: :destroy

has_many :items, through: :report_items

项目

has_many :report_items, dependent: :destroy

has_many :reports, through: :report_items

ReportItem

belongs_to :item

belongs_to :report

我搭建了所有 3 个模型,所以现在每个模型都有 3 个单独的视图。

现在如果我想将项目分配给报告,我必须:

  1. 新建项目记录

  2. 新建报告记录

  3. 创建新的 ReportItem 记录,使用 Item 和 Report 的 ID 将它们联系在一起。

但是我需要的是 ReportItem 嵌套在 Report 中。我的想法是,在创建新报告后,我可以转到其 "show" 页面并从那里创建 "report_items" 记录。这些 "report_items" 记录自动使用当前 "report" 记录的 ID。

我去 http://guides.rubyonrails.org/routing.html 研究了它的工作原理。但是,我仍然对如何实际完成它感到困惑。

对此有什么建议吗?

您可以使用 accepts_nested_attributes_for。 在您 报告 创建表单中,

<%= simple_form_for(@report) do |form| %>
  <%= form.input :title %>

  <%= form.simple_fields_for(:report_items) do |ri_form| %>
    <%= ri_form.input :name %>
  <% end %>

  <%= form.submit "Submit" %>
<% end %>

那么,您的报告模特:

accepts_nested_attributes_for :report_items

在您的 ReportController 中,获取嵌套属性:

private
def report_params
 params.require(:report).permit(:name, :report_items_attributes => [:name])
end

检查 this 答案以获得更好的视图。 Here 是一个很好的教程。

已编辑

您好像创建了一个新报告,然后转到显示页面。在显示页面中,您要创建 Report Item。因此,当您转到显示页面时,当前 url 必须包含当前 report_id。您只需要 Item_id。您可以使用 ID 加载所有 项目 ,并创建一个下拉菜单到 select item_id。然后在显示页面中,report_item 可能看起来像:

<%= simple_form_for(@report_item) do |form| %>
  # in the current page @report contains the current report object  
  <%= form.input :report_id, as: hidden, value: @report.id %>
  # @items = Item.all
  <%= form.input :item_id, collection: @items, label_method: :item_name, value_method: :id, label: "Item", include_blank: false, selected: @report.item_id %>

  <%= form.submit "Submit" %>


<% end %>

希望对您有所帮助!