3

私はrails4アプリを持っています。現時点では、コレクションの選択は、オプションを 1 つだけ選択した場合にのみ機能します。以下は私の作業コードです。商品形態しかありません。インダストリ モデルには が設定されていseeds.rbます。IndustryProduct は、他の 2 つのモデルを接続するためにのみ使用されます。

さらに選択できるようにするには、コードで何を変更する必要があるかを知りたいです。

( https://www.youtube.com/watch?v=ZNrNGTe2Zqkmultiple: true at 10:20 )のようなオプションを使用したいくつかの実用的な例を見まし たが、この場合、UIはちょっと醜いです+サンプルのいずれでもそれを引き出すことができませんでしたコード。複数のオプションを含む 1 つのボックスではなく、1 つのオプションを選択した複数のボックスを用意するなど、他の解決策はありますか?

モデル:

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

_form.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
4

1 に答える 1

5

まず、最初のコレクションの選択を修正して、次のように設定し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 } %>

テスト済み & 動作中 ここに画像の説明を入力

--

以下も参照してくださいcollection_check_boxes

<%= f.collection_check_boxes :industry_ids, Industry.all, :id, :name %>
于 2016-02-15T21:39:05.727 に答える