2011-09-01 49 views
3

我试图同时创建组,用户和成员关系(多对多关系)。人们可以在用户创建它时添加用户,然后我希望它可以通过所有成员路由到该组的视图。我可以创建用户并将当前用户的成员资格保存到数据库。不过,我努力为新创建的用户对象获取id以保存新的成员资格。在嵌套导轨上创建多对多关系

Group.rb
class Group < ActiveRecord::Base 
    has_many :memberships 
    has_many :users, :through => :memberships 
    has_many :users 

    accepts_nested_attributes_for :users, :reject_if => lambda { |a| a[:name].blank? or a[:number].blank? } 
end 

Membership.rb
class Membership < ActiveRecord::Base 
    belongs_to :groups 
    belongs_to :users 
end 

User.rb
class User < ActiveRecord::Base 
    has_many :memberships 
    has_many :groups, :through => :memberships 
    belongs_to :group 
end 

groups_controller.rb
class GroupsController < ApplicationController 

    def show 
    @group = Group.find(params[:id])  
    respond_to do |format| 
     format.html 
    end 
    end 

    def new 
    @group = Group.new 

    3.times { @group.users.build } 
    end 

    def create 
    @group = Group.new(params[:group]) 
    @group.memberships.build(:user_id => current_user.id) 
    logger.info @group.users 

    @group.users.each do |x| 
     @group.memberships.build(:user_id => x.id) 
    end 

    respond_to do |format| 
     if @group.save 
     format.html { redirect_to(@group, :notice => 'Success!') } 
     else 
     format.html { render :action => "new" } 
     end 
    end 

    end 
end 

我的形式如下:

The form creator

这是通过创建:

的意见/组/ new.html.rb

<h1>New group</h1> 

<%= form_for(@group) do |form| %> 
<fieldset> 
    <legend>Create a new group</legend> 
    <%= render 'shared/group_error_messages', :object => form.object %> 
    <div class="clearfix"> 
    <%= form.label :group_name %> 
    <div class="input"> 
     <%= form.text_field :group_name %> 
    </div> 
    </div> 

    <div id="users"> 
    <div class="user"> 
     <%= form.fields_for :users, :url => {:action => 'new', :controller => 'users', :registered => false}, do |user_form| %> 
     <%= render 'user', :user => user_form %> 
     <% end %> 
    </div> 
    </div> 
</div> 

<div class="actions"> 
    <%= form.submit :value => 'Create your group', :class => 'btn success'%> 
</div> 
</fieldset> 
<% end %> 

的意见/组/ _user.html。 RB

<div class="clearfix"> 
    <%= user.label :name %> 
    <div class="input"> 
    <%= user.text_field :name %> 
    </div> 
</div> 
<div class="clearfix"> 
    <%= user.label :number %> 
    <div class="input"> 
    <%= user.text_field :number %> 
    </div> 

</div> 
<div class="clearfix" style="display:none"> 
    <%= user.label :password %> 
    <div class="input"> 
    <%= user.password_field :password, :value => newpass(6) %><!-- todo: fix this horrible hack --> 
    </div> 
</div> 
<div class="clearfix" style="display:none"> 
    <%= user.label :registered %> 
    <div class="input"> 
    <%= user.text_field :registered, :value => false %> <!-- todo: fix this horrible hack --> 
    </div> 
</div> 
<div class="clearfix" style="display:"> 
    <%= user.label :id %> 
    <div class="input"> 
    <%= user.text_field :id %> <!-- todo: fix this horrible hack --> 
    </div> 
</div> 

所以我的主要愿望是让此位Ø f代码在创建时查找用户ID,然后使用这些ID构建组和用户之间的成员资格。

感谢非常,非常提前多少:)

回答

4

我觉得

has_many :users, :through => :memberships 
has_many :users 

是错误的,你不能有两个或多个关联同名。

尝试做

has_many :users, :through => :memberships 
has_many :members, :class_name => 'User', :foreign_key => :user_id 

,并在视图和控制器相应的变化。像

form.fields_for : members 
+0

我得到的错误: '引发ArgumentError(未知的密钥(S):类): 应用程序/模型/ group.rb:26:在' 应用程序/模型/ group.rb:21:在' app/controllers/groups_controller.rb:24:in new'' –

+0

try:class_name =>'User' – rtcoms

+1

has_many:members,:class_name =>'User',:foreign_key =>: user_id – pduey