Rails&Rolify:在创建时添加默认角色?

Jml*_*ick 3 authorization roles ruby-on-rails

目前我正在使用Rolify和CanCan来管理我的Rails 3应用程序中的角色和能力.我的问题是:如何让用户在创建时默认拥有角色?例如,如果我有"用户"角色,¿我怎样才能让在我的应用程序中注册的所有用户默认拥有用户角色?我的Ability.rb有这个代码:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.has_role? :admin
      can :manage, :all
    elsif user.has_role? :user
      can :update, User, :id => user.id
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我的用户模型有这个:

class User < ActiveRecord::Base
  rolify
  authenticates_with_sorcery!
  attr_accessible :username, :email, :password, :password_confirmation

  validates_confirmation_of :password
  validates_presence_of :password, :on => :create
  validates_presence_of :username
  validates_uniqueness_of :username
  validates_presence_of :email
  validates_uniqueness_of :email
end
Run Code Online (Sandbox Code Playgroud)

角色模型这一块:

class Role < ActiveRecord::Base
  has_and_belongs_to_many :users, :join_table => :users_roles
  belongs_to :resource, :polymorphic => true
end
Run Code Online (Sandbox Code Playgroud)

UsersController我们有:

def new
  @user = User.new
end

def create
  @user = User.new(params[:user])

  if @user.save
    redirect_to users_path, :notice => "Tu usuario se ha guardado"
  else
    render "new"
  end
end
Run Code Online (Sandbox Code Playgroud)

最后,Rolify Migration就是这样一个:

class RolifyCreateRoles < ActiveRecord::Migration
  def change
    create_table(:roles) do |t|
      t.string :name
      t.references :resource, :polymorphic => true

      t.timestamps
    end

    create_table(:users_roles, :id => false) do |t|
      t.references :user
      t.references :role
    end

    add_index(:roles, :name)
    add_index(:roles, [ :name, :resource_type, :resource_id ])
    add_index(:users_roles, [ :user_id, :role_id ])
  end
end
Run Code Online (Sandbox Code Playgroud)

现在,我可以使用以下命令从rails控制台手动分配角色:

1 User.all
2 User.find(id)
3 User.add_role(:role)
Run Code Online (Sandbox Code Playgroud)

但是,如何在创建每个用户时自动分配默认角色?

谢谢!

Dty*_*Dty 23

您可以使用活动记录回调在创建用户后分配角色.就像是

class User < ActiveRecord::Base
  after_create :assign_default_role

  def assign_default_role
    add_role(:role)
  end
end
Run Code Online (Sandbox Code Playgroud)

请注意,还有一个after_save回调,但每次保存用户时都会调用它.因此,如果您编辑用户并保存,则会尝试再次添加该角色.这就是我使用after_create回调的原因.


Cam*_*ong 7

您最好在add_role之前检查是否已分配角色.所以我更喜欢:

class User < ActiveRecord::Base
  after_create :assign_default_role

  def assign_default_role
    add_role(:normal) if self.roles.blank?
  end
end
Run Code Online (Sandbox Code Playgroud)