0

コントローラ

class PlayerProfilesController < InheritedResources::Base

    def show
        @player_profile = PlayerProfile.find(params[:id])
    end
end

モデル

class PlayerProfile < ActiveRecord::Base

  has_many :playing_roles, :dependent => :destroy
  has_many :player_roles, through: :playing_roles

end

class PlayerRole < ActiveRecord::Base

   has_many :playing_roles, :dependent => :destroy 
   has_many :player_profiles, through: :playing_roles

end

class PlayingRole < ActiveRecord::Base
  belongs_to :player_profile
  belongs_to :player_role

end

show.html.erb

<%=collection_check_boxes(:player_profile, :playing_roles, PlayerRole.all, :id, :name)%>

collection_check_boxes (ドキュメント)

2 つのチェックボックス用に生成された HTML

<input id="player_profile_playing_roles_1" name="player_profile[playing_roles][]" type="checkbox" value="1" class="hidden-field">
<span class="custom checkbox checked"></span>
<label for="player_profile_playing_roles_1">Striker</label>

<input id="player_profile_playing_roles_2" name="player_profile[playing_roles][]" type="checkbox" value="2" class="hidden-field">
<span class="custom checkbox"></span>
<label for="player_profile_playing_roles_2">Midfielder</label>
<input name="player_profile[playing_roles][]" type="hidden" value="">

すべて正しく表示されているようですが、送信ボタンをクリックすると次のエラーが表示されます。 ここに画像の説明を入力

4

1 に答える 1

4

申し訳ありませんが、これは複雑だと思いましたが、そうではないと思います。

collection_check_boxesに期待するように伝えていますが、:playing_rolesを介して PlayerRoles のコレクションを渡していPlayerRole.allます。それがミスマッチです。AssociationTypeMismatch は、オブジェクトに Duck を関連付けるように指示してから Helicopter を渡す場合です。

これを行う必要があります:

<%= collection_check_boxes(:player_profile, :player_role_ids, PlayerRole.all, :id, :name) %>

期待するように指示し、値メソッドとテキスト メソッド:player_role_idsのコレクションを渡します。PlayerRole.all:id:name

次に、更新時に、それらの ID がplayer_role_idsPlayer の属性に保存され、関連付けが構築されます。

参照: Rails has_many :through と collection_select with multiple

于 2013-07-09T15:36:50.617 に答える