0
私はかなり新しいレールです。複数の選択を使用する場合、アソシエーションテーブルを更新する際にいくつかの問題があります。Railsのネストされたアソシエーションと複数のcollection_select
私は私の望ましい結果は、「複数選択フィールドということである3つのテーブル、portrait
portrait_tags
とtags
(タグは私のタグ名(伝統的な、インスピレーション、コミュニティなど)の名前を格納)
を持っています'は、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 |
+----+-----------+--------------------+
ありがとうございました。あなたは少し理由を説明できますか?私はこれを理解するのに苦労している! – Adam
この場合、fields_forを使用するとエラーになりました。 –
ありがとうAtul、 私はform_forの中に別のフィールドを持っていますが、どうすれば複数のparamを渡すことができますか? params.require(:portrait).permit(:id、:artist_image) params.require(:portrait_tag).permit(:id、:tag_ids => []) – Adam