代码之家  ›  专栏  ›  技术社区  ›  Sean Magyar

rails4集合通过关联和嵌套模型表单使用hasmany进行选择

  •  3
  • Sean Magyar  · 技术社区  · 9 年前

    我有一个rails4应用程序。目前,我的收藏选择仅在我只选择一个选项时有效。下面是我的工作代码。我只有产品形式。行业模型填充了 seeds.rb .IndustryProduct仅用于连接其他2个型号。

    我想知道我必须在代码中更改什么才能选择更多。

    我看到了一些与 multiple: true 类似选项( https://www.youtube.com/watch?v=ZNrNGTe2Zqk 10:20),但在这种情况下,UI有点丑+无法用任何示例代码实现。有没有其他解决方案,比如让多个框选择一个选项,而不是一个框选择多个选项?

    模型:

    class Product < ActiveRecord::Base
      belongs_to :user
      has_many :industry_products
      has_many :industries, through: :industry_products
      has_many :product_features
    
      accepts_nested_attributes_for :industry_products, allow_destroy: true
      accepts_nested_attributes_for :product_features
    
      validates_associated :industry_products
      validates_associated :product_features
    end
    
    class Industry < ActiveRecord::Base
      has_many :industry_products
      has_many :products, through: :industry_products
    
      accepts_nested_attributes_for :industry_products
    end
    
    class IndustryProduct < ActiveRecord::Base
      belongs_to :product
      belongs_to :industry
    end
    

    _表单.html erb

    <%= form_for @product do |f| %>
      <%= render 'layouts/error_messages', object: f.object %>
      ......
      <%= f.fields_for :industry_products do |p| %>
        <%= p.collection_select :industry_id, Industry.all, :id, :name %>
      <% end %>
      <%= f.fields_for :product_features do |p| %>
        <%= p.text_field :feature, placeholder: "add a feature", class: "form-control" %>
      <% end %>
      <%= f.submit class: "btn btn-primary" %>
    <% end %>
    

    产品控制器

    def new
      @product = Product.new
      @product.industry_products.build
      @product.product_features.build
    end
    
    def create
      @product = current_user.products.new(product_params)
      if @product.save
        redirect_to @product
      else
        render action: :new
      end
    end
    ......
    def product_params
      params.require(:product).permit(....., industry_products_attributes: [:id, :industry_id, :_destroy], industries_attributes: [:id, :name], product_features_attributes: [:feature])
    end
    
    1 回复  |  直到 9 年前
        1
  •  5
  •   unom    8 年前

    首先,您可以通过使用它设置 industry_ids 对于 @product :

    <%= form_for @product do |f| %>
      <%= f.collection_select :industry_ids, Industry.all, :id, :name %>
    <% end %>
    

    这将允许您设置 collection_singular_ids 方法,该方法适用于所有 has_many 协会。

    您必须在params方法中备份它:

    #app/controllers/products_controller.rb
    ....
    def product_params
      params.require(:product).permit(.... industry_ids: [])
    end
    

    比使用嵌套属性简洁得多。


    要获得“多重”选择,您需要使用以下方法:

    <%= f.collection_select :industry_ids, Industry.all, :id, :name, {}, { multiple: true } %>
    

    已测试&工作 enter image description here

    --

    你也可以看看 collection_check_boxes :

    <%= f.collection_check_boxes :industry_ids, Industry.all, :id, :name %>