如何组织 form_for 助手来显示来自不同模型的数据?

How to organize form_for helper to show data from different models?

我有三个模型 PriceGroup、PriceGroupLine 和 Item。

PriceGroup has fields - :id and :name. 

Item has fields - :id and :name. 

PriceGroupLine has fields - :id, :price_group_id, :item_id, :price

协会:

PriceGroup has_many PriceGroupLines

Item has_one PriceGroupLine

PriceGroupLine belongs_to Item

PriceGroupLine belongs_to PriceGroup

我需要从 PriceGroup 显示视图插入 PriceGroupLine 模型行。如果我需要在 PriceGroupLine 中插入,我应该如何组织 form_for 助手:

item_id - items list organized with collection_select helper
price_group_id
price of item

我正在使用此代码查看,但无法插入它:

<%= form_for @price_group, html: {class: "form-inline"} do |f| %> 
  <div class="form-group"> 
    <label>Товар</label> 
    <%= f.collection_select(:id, Item.all, :id, :name, {}, {class: "form-control"}) %> 
  </div> 
  <div class="form-group"> 
    <label>Цена</label> 
    <%= f.text_field :price, class: "form-control" %> 
  </div> 
  <%= f.submit "Добавить", class: "btn btn-default" %> 
<% end %>

还有一个关于协会的问题。一开始我有这样的联想:

PriceGroup has_many PriceGroupLines

PriceGroupLine has_many Items

Item belongs_to PriceGroupLine

PriceGroupLine belongs_to PriceGroup

但是当我尝试从项目模型中获取 :name 字段时,这种关联无法正常工作,如下所示:

<% @price_group.price_group_lines.each do |price_group_line| %>
  <%= price_group_line.item.try(:name) %>>
  <%= price_group_line.price %>
<% end %>

我改变了联想,一切都奏效了。现在 PriceGroupLine belongs_to :itemItem has_one :price_group_line。但假设 ITEM 属于 PriceGroupLine(PRICEGROUPLINE 包含 ITEM)是合乎逻辑的。我错了吗?

更新 差不多了:)) 这是我的表格的屏幕截图。

显示代码 PriceGroup:

<%= form_for @price_group, html: {class: "form-inline"} do |f| %>
    <%= f.fields_for :price_group_lines do |price_group_line| %>
        <%= render partial: "price_group_line_fields", locals: { f: price_group_line } %>
    <% end %>
  .links
     <%= link_to_add_association "Добавить", f, :price_group_lines %>
<% end %>

部分代码:

<div class="form-group"> 
    <label>Товар</label>
    <%= f.collection_select(:item_id, Item.all, :id, :name, {}, {class: "form-control"}) %>
  </div> 
  <div class="form-group"> 
    <label>Цена</label> 
    <%= f.text_field :price, class: "form-control" %> 
 </div>

在页脚中,Helper 为数据库中的每条记录创建字段。我只需要项目列表 select 一个合适的项目和空白字段 PRICE 来输入价格。并且出现了一些单词 .link。

首先,您将需要嵌套表单。使用嵌套表单,您将能够从 price_group 表单插入多个 price_group_lines。我建议您为此使用 gem 之类的 Cocoon。您需要做的是:

形式:

<%= form_for @price_group, html: {class: "form-inline"} do |f| %>
  <%= f.fields_for :price_group_lines do |price_group_line| %>
    <%= render 'price_group_line_fields', f: price_group_line %>
  <% end %>
  <div class='links'>
     <%= link_to_add_association 'add price group line', f, :price_group_lines %>
  </div>
<% end %>

在price_group_line_fields中:

  <div class="form-group"> 
    <label>Товар</label>
    <%= f.collection_select(:item_id, Item.all, :id, :name, {}, {class: "form-control"}) %>
  </div> 
  <div class="form-group"> 
    <label>Цена</label> 
    <%= f.text_field :price, class: "form-control" %> 
  </div>

并且在您的控制器中,您需要在强参数中允许这样做:

params.require(:price_group).permit(:name, :price_group_lines_attributes => [:item_id, :price])

在你的 PriceGroup 模型中你需要写:

accepts_nested_attributes_for :price_group_lines

这只是使用 cocoon gem 的示例和粗略代码,您可以通过搜索 rails 嵌套形式找到更多选项。该代码可能会抛出您可以轻松修复的错误。

希望这对您有所帮助。