4

現在、Ruby 2.0 と Rails 4 ベータ版を使用して作成された非常に単純な設計をしています。

ユーザーとグループがあります。ユーザーは複数のグループのメンバーになることができ、グループは複数のユーザーをメンバーとして持つことができます。したがって、user_id と group_id のみを含む結合モデル UserGroup があります。次のように:

class User < ActiveRecord::Base
    has_many :user_groups, dependent: destroy
    has_many :groups, through: :user_groups
    accepts_nested_attributes_for :user_groups, allow_destroy: true
end

class Group < ActiveRecord::Base
    has_many :user_groups, dependent: destroy
    has_many :users, through: :user_groups
end

class UserGroup < ActiveRecord::Base
    belongs_to :user, inverse_of: :user_groups
    belongs_to :group, inverse_of: :user_groups

    validates :user_id,   presence: true
    validates :group_id,  presence: true
end

作成/更新時に単一の関連オブジェクトを作成しているように見えるaccepts_nested_attributes_forに関する多くのことを見つけました。私が欲しいのは、現在システム内にあるユーザーをメンバーにしたいすべてのグループのリストから複数の選択肢を選択できるマルチオプション選択ボックスです。送信すると、すべての user_group 関連付けが生成されます。

これを利用するために、コントローラーまたはビューのいずれかで必要なものを解決できません。私は現在持っています:

<%= form_for(@user) do |f| %>
    <div class="field">
        <%= f.label :username %><br />
        <%= f.text_field(:username) %>
    </div>

    <div class="field">
        <%= f.label :group_ids, 'Group memberships' %><br />
        <%= f.select :group_ids, @groups.collect {|g| [g.name, g.id]}, {}, multiple: true %>
    </div>
<% end %>

ビューと:

def create
    @user = User.new(user_params)
    @user.save
end

def user_params
    params.require(:user).permit(:forename, :surname, :email, :group_ids)
end

私のコントローラーで(もちろん、今はテストしていない他のすべてのアクションとともに)。

これは機能していません。グループ メンバーシップを持つ既存のユーザーの編集ページに移動すると、複数項目の選択ボックスに正しく表示されますが、メンバーシップを変更したり、新しいユーザーに設定したりすることはできません。ユーザー オブジェクトは保存されますが、関連する user_group オブジェクトが作成または破棄されません。ここで私が間違っていることと、それを機能させるために何をする必要があるかを誰かに教えてもらえますか? 過去数時間、StackOverflow と Google をトロールしましたが、どこにも行きませんでした...

4

1 に答える 1