簡體   English   中英

Rails&Rolify:在創建時添加默認角色嗎?

[英]Rails & Rolify: Add default role on creation?

目前,我正在使用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

我的用戶模型包含以下內容:

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

這個榜樣

class Role < ActiveRecord::Base
  has_and_belongs_to_many :users, :join_table => :users_roles
  belongs_to :resource, :polymorphic => true
end

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

最后, Rolify遷移是這樣的:

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

現在,我可以使用以下方法從Rails控制台手動分配角色:

1 User.all
2 User.find(id)
3 User.add_role(:role)

但是,如何在創建每個用戶時自動為其分配默認角色?

謝謝!

創建用戶后,可以使用活動記錄回調來分配角色。 就像是

class User < ActiveRecord::Base
  after_create :assign_default_role

  def assign_default_role
    add_role(:role)
  end
end

請注意,還有一個after_save回調,但是after_save保存用戶時都稱為回調。 因此,如果您編輯用戶並保存,將嘗試再次添加角色。 這就是為什么我改用after_create回調。

您最好檢查是否在add_role之前分配了角色。 所以我更喜歡:

class User < ActiveRecord::Base
  after_create :assign_default_role

  def assign_default_role
    add_role(:normal) if self.roles.blank?
  end
end

算了,只需添加:

@user.add_role(:user)

@user = User.new(params[:user])行之后的創建操作中。

我自己弄清楚了...我還在學習:)

謝謝!

after_create :default_role

private
  def default_role
    self.roles << Role.find_by_name("user")
    self.save
  end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM