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 个单独的视图。
现在如果我想将项目分配给报告,我必须:
新建项目记录
新建报告记录
创建新的 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 %>
希望对您有所帮助!
我有 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 个单独的视图。
现在如果我想将项目分配给报告,我必须:
新建项目记录
新建报告记录
创建新的 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 %>
希望对您有所帮助!