我有三个型号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 :item
和Item 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>
在页脚中,Helper为数据库中的每条记录创建字段。我只需要项目列表来选择合适的项目和空白字段PRICE来输入价格。还有一些单词.link出现。
答案 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嵌套表单找到更多选项。代码可能会抛出您可以轻松修复的错误。
希望这有帮助。