2013-04-28 5 views
4

저는 Ruby 2.0과 Rails 4 베타를 사용하여 만든 매우 간단한 디자인을 가지고 있습니다.joins 테이블에서> 1 관련 객체를 생성하기 위해 accepts_nested_attributes_for를 어떻게 사용합니까?

사용자와 그룹이 있습니다. 사용자는 여러 그룹의 구성원이 될 수 있으며 그룹은 여러 사용자를 구성원으로 가질 수 있습니다. 따라서 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을 트래킹하면서 아무데도 보냈습니다 ...

답변

3

실제로 strong_parameters 해시를 수정해야했습니다. 내 params [: user] [: group_ids]이 (가) 업데이트 메소드에서 거부되었습니다. strong_parameters에 간단한 속성의 배열이라는 것을 알릴 필요가있었습니다.

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