集合 Select 未在 rails 4 的编辑表单中显示所选值
Collection Select not displaying the selected value in edit form for rails 4
我有一个 Vendor 模型、一个 Product 模型和一个具有以下关联的 VendorProduct 模型
class Vendor < ActiveRecord::Base
has_many :vendor_products
has_many :products, through: :vendor_products
end
class Product < ActiveRecord::Base
has_many :vendor_products
has_many :vendors, through: :vendor_products
end
class VendorProduct < ActiveRecord::Base
belongs_to :vendor
belongs_to :product
end
我正在使用 nested_form gem 为我的供应商 _form.html.erb 页面
上的产品显示下拉集合 select 选项
<%= nested_form_for(@vendor) do |f| %>
<% if @vendor.errors.any? %>
:
:
:
<%= f.fields_for :vendor_products do |vproducts| %>
<%= render 'product_fields', :f => vproducts %>
<%= vproducts.link_to_remove "Remove this Product" %>
<% end %>  
<%= f.link_to_add "Add product", :vendor_products %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
我的_product_fields.html.erb是
<div class= "vendor_products">
<div class="field">
<%= f.label :product_id %><br>
<%= f.select :product_id,
options_from_collection_for_select(Product.all, "id",
"product_name"), prompt: "Select something", %>
 
<%= f.label :copies %>
<%= f.number_field :copies %>
</div>
</div>
我的 Vendor 模型具有以下 accepted_nested_attributes for vendor_products
class Vendor < ActiveRecord::Base
accepts_nested_attributes_for :vendor_products, :allow_destroy =>
true, :reject_if => :all_blank
end
我的供应商控制器在这里
def new
@vendor = Vendor.new
@vendor.vendor_products.build
end
def edit
@vendor.vendor_products.build
end
供应商和包含 Product_id
和 Vendor_id
的 VendorProduct
得到正确填充。一切正常,唯一的问题是在供应商编辑页面中,产品 select 选项不显示 selected 值,而是显示下拉列表中的第一个选项。但是,当我检查该行的值时,已将正确的产品添加到 table.Only,编辑页面下拉列表不显示实际的 selected 值。
我该如何解决这个问题?请帮忙
这是 nested_attributes
和 dropdown
的问题
您可以使用表单对象 "f"
使用 f.object.product_id
获取 :product_id
并将其作为 selected
值
传递
<%= f.select :product_id,
options_from_collection_for_select(Product.all, "id", "product_name", f.object.product_id),
prompt: "Select something" %>
我建议采用 Deepak Mahakale 提到的使用 options_from_collection_for_select
的方式
<=% f.select :produt_id,
options_from_collection_for_select(
Product.all, :id, :product_name, f.object.product_id)
%>
这是我玩的另一种方式,但似乎不是 "Rails standard"。
<=% f.select :produt_id,
Product.pluck(:product_name, :id),
{ selected: f.object.product_id }
%>
我经历了这种疯狂,所以我可以下拉 belongs_to
关系。
我有一个 Vendor 模型、一个 Product 模型和一个具有以下关联的 VendorProduct 模型
class Vendor < ActiveRecord::Base
has_many :vendor_products
has_many :products, through: :vendor_products
end
class Product < ActiveRecord::Base
has_many :vendor_products
has_many :vendors, through: :vendor_products
end
class VendorProduct < ActiveRecord::Base
belongs_to :vendor
belongs_to :product
end
我正在使用 nested_form gem 为我的供应商 _form.html.erb 页面
上的产品显示下拉集合 select 选项<%= nested_form_for(@vendor) do |f| %>
<% if @vendor.errors.any? %>
:
:
:
<%= f.fields_for :vendor_products do |vproducts| %>
<%= render 'product_fields', :f => vproducts %>
<%= vproducts.link_to_remove "Remove this Product" %>
<% end %>  
<%= f.link_to_add "Add product", :vendor_products %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
我的_product_fields.html.erb是
<div class= "vendor_products">
<div class="field">
<%= f.label :product_id %><br>
<%= f.select :product_id,
options_from_collection_for_select(Product.all, "id",
"product_name"), prompt: "Select something", %>
 
<%= f.label :copies %>
<%= f.number_field :copies %>
</div>
</div>
我的 Vendor 模型具有以下 accepted_nested_attributes for vendor_products
class Vendor < ActiveRecord::Base
accepts_nested_attributes_for :vendor_products, :allow_destroy =>
true, :reject_if => :all_blank
end
我的供应商控制器在这里
def new
@vendor = Vendor.new
@vendor.vendor_products.build
end
def edit
@vendor.vendor_products.build
end
供应商和包含 Product_id
和 Vendor_id
的 VendorProduct
得到正确填充。一切正常,唯一的问题是在供应商编辑页面中,产品 select 选项不显示 selected 值,而是显示下拉列表中的第一个选项。但是,当我检查该行的值时,已将正确的产品添加到 table.Only,编辑页面下拉列表不显示实际的 selected 值。
我该如何解决这个问题?请帮忙
这是 nested_attributes
和 dropdown
您可以使用表单对象 "f"
使用 f.object.product_id
获取 :product_id
并将其作为 selected
值
<%= f.select :product_id,
options_from_collection_for_select(Product.all, "id", "product_name", f.object.product_id),
prompt: "Select something" %>
我建议采用 Deepak Mahakale 提到的使用 options_from_collection_for_select
<=% f.select :produt_id,
options_from_collection_for_select(
Product.all, :id, :product_name, f.object.product_id)
%>
这是我玩的另一种方式,但似乎不是 "Rails standard"。
<=% f.select :produt_id,
Product.pluck(:product_name, :id),
{ selected: f.object.product_id }
%>
我经历了这种疯狂,所以我可以下拉 belongs_to
关系。