1

我有一个 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 页面上显示产品的下拉集合选择选项

<%= 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 %> &nbsp
    <%= 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", %>
      &nbsp
    <%= f.label :copies %>
    <%= f.number_field :copies %>
  </div>
</div>

我的供应商模型对于 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

供应商及其VendorProduct包含Product_idVendor_id正确填充。一切正常,唯一的问题是在供应商编辑页面中,产品选择选项不显示所选值,而是显示下拉列表中的第一个选项。但是,当我检查该行的值时,正确的产品已添加到表中。只有编辑页面下拉菜单不显示实际选择的值。

我怎样才能解决这个问题?请帮忙。

4

2 回答 2

5

这是和的nested_attributes问题dropdown

您可以使用表单对象"f":product_id使用f.object.product_id并将其作为selected值传递

<%= f.select :product_id,
              options_from_collection_for_select(Product.all, "id", "product_name", f.object.product_id), 
              prompt: "Select something" %>

参考options_from_collection_for_select

于 2016-09-14T07:28:00.387 回答
0

我建议按照 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 标准”。

<=% f.select :produt_id,
  Product.pluck(:product_name, :id),
  { selected: f.object.product_id }
%>

我经历了这种疯狂,所以我可以有一个belongs_to关系的下拉菜单。

于 2020-01-29T03:33:36.727 回答