как заполнить данные в таблице ролей пользователей с помощью devise in rails?
Я только учусь использовать devise in rails, следуя видео-уроку Райана Бейтса
Это прекрасно работает для меня .
Но теперь мне нужно добавить роли в мое приложение, чтобы применить условие на основе ролей в интеграции cancanМои модели 1: пользователь.rb
class User < ActiveRecord::Base
has_and_belongs_to_many :roles
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
attr_accessible :email, :password, :password_confirmation, :remember_me
has_and_belongs_to_many :roles
def role?(role)
return !!self.roles.find_by_name(role.to_s.camelize)
end
end
Моя модель 2: роль.rb
class Role < ActiveRecord::Base
attr_accessible :name
has_and_belongs_to_many :users
end
Мой файл миграции пользователей
class DeviseCreateUsers < ActiveRecord::Migration
def change
create_table(:users) do |t|
## Database authenticatable
t.string :email, :null => false, :default => ""
t.string :encrypted_password, :null => false, :default => ""
## Recoverable
t.string :reset_password_token
t.datetime :reset_password_sent_at
## Rememberable
t.datetime :remember_created_at
## Trackable
t.integer :sign_in_count, :default => 0
t.datetime :current_sign_in_at
t.datetime :last_sign_in_at
t.string :current_sign_in_ip
t.string :last_sign_in_ip
t.timestamps
end
add_index :users, :email, :unique => true
add_index :users, :reset_password_token, :unique => true
end
end
Мой файл миграции ролей
class CreateRoles < ActiveRecord::Migration
def change
create_table :roles do |t|
t.string :name
t.timestamps
end
end
end
Мой файл миграции таблицы соединений
class UsersHaveAndBelongToManyRoles < ActiveRecord::Migration
def up
create_table :roles_users, :id => false do |t|
t.references :role, :user
end
end
def down
drop_table :roles_users
end
end
Теперь, когда я создаю пользователя, я хочу, чтобы моя роль была прикрепленный с пользователем, а также присоединенная таблица должна иметь запись,
Как я могу это сделать ??
1 ответ:
Rails автоматически создает запись таблицы соединений. Вы можете устанавливать роли для пользователей различными способами. Вот несколько примеров:
@user << Role.find_by_name('admin') # Adds the admin role to the users roles and save @user.roles.create(:name => 'admin') # Creates a new role and add to the the user @user.role_ids = [1,2,3] # Adds the roles with id 1, 2 and 3 and delete all others @user.roles = [Role.find_by_name('admin'), Role.find_by_name('superuser')] # Adds admin and superuser roles and delete all others
Вы можете посмотреть все доступные варианты здесь: http://guides.rubyonrails.org/association_basics.html#has_and_belongs_to_many-association-reference
Это означает, что если вы хотите иметь роль по умолчанию при создании новых пользователей, не могли бы вы сделать что-то вроде этого:
class User < ActiveRecord::Base has_and_belongs_to_many :roles before_create :set_default_role private def set_default_role # Add the default role if no roles is set self.roles << Role.find_by_name('default') if roles.empty? end end
Вы также можете прочитать больше об этом предмете здесь: http://www.tonyamoyal.com/2010/07/28/rails-authentication-with-devise-and-cancan-customizing-devise-controllers/