2011-10-17 60 views
0

我是Rails 3的新手,并且无法在Join表中保存记录。我一直在环顾四周,尝试通过本网站以及文档或书籍找到不同的示例,但我不明白为什么我无法使用它。我正在尝试通过创建角色并将它们关联到用户来创建授权。到目前为止,我一直试图从用户控制器中的更新操作中分配角色,但没有获胜。保存记录加入表Has_many:通过

我有3个型号:在User.rb,role.rb和assignment.rb(连接表)

class User < ActiveRecord::Base 
    has_many :assignments, :dependent => :destroy 
    has_many :roles, :through => :assignments, :foreign_key => :role_id 
    accepts_nested_attributes_for :roles 
    attr_accessor :password, :role_ids 
    attr_accessible :first_name, :last_name, :email, :password, :password_confirmation, :status, :description, :username, :roles_attributes 
    ... 
end 

class Role < ActiveRecord::Base 
    has_many :assignments 
    has_many :users, :through => :assignments, :foreign_key => :user_id 
    accepts_nested_attributes_for :users 
    attr_accessible :name 
end 

class Assignment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :role 
    accepts_nested_attributes_for :roles 
end 

在更新操作的用户控制器我有以下

class UsersController < ApplicationController 
    ... 
    def update 
    @user = User.find(params[:id]) 
    if @user.update_attributes(params[:user]) 
     @user.roles.build 
     flash[:success] = "Profile updated" 
     redirect_to @user 
    else 
     @title = "Edit" + " " + @user.username 
     render 'edit' 
    end 
    end 
    ... 
end 

,并在“编辑”视图页面我打算复选框更新与相关联的角色的用户记录:

编辑:改变了“车ck_box“和”check_box_tag“...复选框正确显示,但值不会被保存。

<%= form_for(@user) do |f| %> 
    ... 
    <div class="field"> 
    <%= f.label :roles %><br /> 
    <%= f.fields_for :role_ids do |r| %> 
     <% @roles.each do |role| %> 
     <%= check_box_tag "user[roles][]", role.id, @user.roles.include?(role.id) %> 
     <%= role.name %> 
     <% end %> 
     <%= hidden_field_tag "user[roles][]", "" %> 
    <% end %> 
    </div> 
<% end %> 

有了这段代码,我甚至会在'角色'没有关联的地方出错。

编辑:这是用accepts_nested_attributes_for :role纠正。谢谢!

未找到名称“角色”的关联。它已被定义?

我真的很困惑,我做错了什么。您的帮助将不胜感激。

的Aurelien

回答

2

你必须用“accepts_nested_attributes_for”使用相同的名称为您所用定义的关联:

class Assignment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :role 
    accepts_nested_attributes_for :role 
end 
+0

谢谢@mosch,它修复了关联问题!不幸的是,我仍然遇到了将角色ID保存到分配表的问题。 –

0

终于解决了问题,我想我可以分享。

的模型协会,但我没有改变attr_accessible:

class User < ActiveRecord::Base 
    has_many :assignments, :dependent => :destroy 
    has_many :roles, :through => :assignments, :foreign_key => :role_id 
    accepts_nested_attributes_for :roles 
    attr_accessor :password 
    attr_accessible ..., :roles_ids 
    ... 
end 

在用户控制器的编辑和更新操作。

def edit 
    @title = "Edit" + " " + @user.username 
    @roles = Role.find(:all) 
    @user.assignments.build 
end 

def update 
    @user = User.find(params[:id]) 
    if @user.update_attributes(params[:user]) 
    flash[:success] = "Profile updated" 
    redirect_to @user 
    else 
    @title = "Edit" + " " + @user.username 
    render 'edit' 
    end 
end 

的重要部分是视图部分和分配用于复选框标签

<%= form_for(@user) do |f| %> 
    <div class="field"> 
    <%= f.label :roles %><br /> 
    <%= f.fields_for :role_ids do |r| %> 
    <% @roles.each do |role| %> 
     <%= check_box_tag "user[role_ids][]", role.id, @user.roles.include?(role) %> 
     <%= role.name %> 
    <% end %> 
    <%= hidden_field_tag "user[role_ids][]", @user.id %> 
    <% end %> 
</div> 

的让形式保存的阵列权名称和给出比check_box 更多的控制。然后,以分配多个角色ID,check_box_tag的名称应该包括user[roles_ids][]。 最后check_box_tag的最后一个参数返回,如果用户已经拥有角色并且检查复选框是否为true。

我必须承认,check_box_tags的名称部分真的令人困惑,但它的作品:)。