3

現在、Rolify と CanCanを使用して、Rails 3 アプリで役割と能力を管理しています。私の質問は、作成時にデフォルトでユーザーに役割を持たせるにはどうすればよいですか? たとえば、「ユーザー」ロールを持っている場合、¿ アプリに登録するすべてのユーザーにデフォルトでユーザーロールを持たせるにはどうすればよいですか? My 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 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

これで、以下を使用して、 Rails コンソールから手動でロールを割り当てることができます。

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

しかし、すべてのユーザーが作成されたときにデフォルトの役割を自動的に割り当てるにはどうすればよいでしょうか?

ありがとう!

4

4 に答える 4

23

ユーザーの作成後に、アクティブ レコード コールバックを使用してロールを割り当てることができます。何かのようなもの

class User < ActiveRecord::Base
  after_create :assign_default_role

  def assign_default_role
    add_role(:role)
  end
end

コールバックもありafter_saveますが、ユーザーが保存されるたびに呼び出されることに注意してください。そのため、ユーザーを編集して保存すると、ロールを再度追加しようとします。そのため、after_create代わりにコールバックを使用しています。

于 2012-07-03T07:49:54.593 に答える
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
于 2013-03-09T04:14:39.223 に答える
3

それを忘れて、ただ追加する必要がありました:

@user.add_role(:user)

行の直後の作成アクションで@user = User.new(params[:user])

自分でそれを理解しました...私はまだ学んでいます:)

ありがとう!

于 2012-07-03T08:01:30.783 に答える
2
after_create :default_role

private
  def default_role
    self.roles << Role.find_by_name("user")
    self.save
  end
于 2013-06-05T05:06:34.620 に答える