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

时间:2015-07-26 03:48:50

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4

我有三个型号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 helper:

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

但是当我试图获取时,这种关联并没有正常工作:来自Item模型的名字字段如下:

<% @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)是合乎逻辑的。我错了吗?

UPDATE 几乎在那里:))这是我的表格的截图。

显示视图代码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>

show.html.erb

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

1 个答案:

答案 0 :(得分:1)

首先,您将需要嵌套表单。使用嵌套表单,您可以从price_group_lines表单中插入多个price_group。我建议你使用像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嵌套表单找到更多选项。代码可能会抛出您可以轻松修复的错误。

希望这有帮助。