2016-12-07 5 views
0

私はかなり新しいレールです。複数の選択を使用する場合、アソシエーションテーブルを更新する際にいくつかの問題があります。Railsのネストされたアソシエーションと複数のcollection_select

私は私の望ましい結果は、「複数選択フィールドということである3つのテーブル、portraitportrait_tagstags

(タグは私のタグ名(伝統的な、インスピレーション、コミュニティなど)の名前を格納)

を持っています'は、tag.allのtag_id値に基づいてportrait_tagテーブルにタグを追加します。現在、これは1つのフィールドしか挿入していないようですが、portrait_tagテーブルのtag_idはNULLです。編集ページに戻ると、複数選択が複製されます。

PARAMS

Parameters: {"utf8"=>"✓", "authenticity_token"=>"j+Obhq9u+mvOKYnj4+TAGy+be8s3AbZlMvuyKiot5iyKqjMyFAcs23PjbQjOTjwl6aRBx1M5lmYRZzTjOeDTJA==", "portrait"=>{"portrait_tags_attributes"=>{"0"=>{"tag_id"=>["", "1", "2"]}}}, "commit"=>"Save changes", "id"=>"72"} 

Tag.rb

class Tag < ActiveRecord::Base 

    has_many :portraits, through: :portrait_tags 
    accepts_nested_attributes_for :portraits 

end 

Portrait.rb

class Portrait < ActiveRecord::Base 

    has_many :portrait_tags 
    has_many :tags, through: :portrait_tags 

    accepts_nested_attributes_for :portrait_tags 

end 

Portrait_tag.rb

class PortraitTag < ActiveRecord::Base 

    belongs_to :portrait 
    belongs_to :tag 

end 

Edit.html.haml

%h1 Edit Portrait 
= form_for [:admin, @portraits], :html => { :method => :put } do |f| 

    - if flash[:system].present? 
    - flash[:system].each do |e| 
     %div= e 

    - if flash[:notice].present? 
    %div= flash[:notice] 

    = f.fields_for :portrait_tags do |a| 
    = a.collection_select :tag_id, Tag.all, :id, :name, {}, {multiple: true} 

    = f.submit "Save changes", class: "btn btn-primary" 

PortraitController

class Admin::PortraitsController < ApplicationController 

    def edit 
     @portraits = Portrait.where(artist_id: 33, id: params[:id]).take 
     @portraits.portrait_tags.build 

    end 

    def update 

     @portrait = Portrait.where(artist_id: 33, id: params[:id]).take 


     if @portrait.update(portrait_params) 

     p portrait_params 

     else 
     flash[:system] = @portrait.errors.full_messages 
     p @portrait.errors.full_messages 

     render :edit 
     end 

    end 

    private 
     def portrait_params 
     # Permit our attributes 
     params.require(:portrait).permit(:id, portrait_tags_attributes: [:id, :tag_id => [] ]) 

     end 



end 

portrait_tagsテーブル

枚の
+----+-------------+--------+ 
| id | portrait_id | tag_id | 
+----+-------------+--------+ 

肖像画テーブル

+----+-----------+--------------+ 
| id | artist_id | artist_image | 
+----+-----------+--------------+ 

タグテーブル

+----+-----------+--------------------+ 
| id | name | portrait_tag_id | 
+----+-----------+--------------------+ 

答えて

2
<%= collection_select(:portrait_tag, :tag_ids, 
       Tag.all(:order=>"name ASC"), 
       :id, :name, {:selected => @portraits.tag_ids, :include_blank => true}, {:multiple => true}) %> 

これはあなたのために働くことを願っています。

+0

ありがとうございました。あなたは少し理由を説明できますか?私はこれを理解するのに苦労している! – Adam

+0

この場合、fields_forを使用するとエラーになりました。 –

+0

ありがとうAtul、 私はform_forの中に別のフィールドを持っていますが、どうすれば複数のparamを渡すことができますか? params.require(:portrait).permit(:id、:artist_image) params.require(:portrait_tag).permit(:id、:tag_ids => []) – Adam

関連する問題