如何组织 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 :item
和 Item 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 嵌套形式找到更多选项。该代码可能会抛出您可以轻松修复的错误。
希望这对您有所帮助。
我有三个模型 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 :item
和 Item 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 嵌套形式找到更多选项。该代码可能会抛出您可以轻松修复的错误。
希望这对您有所帮助。