Создайте пользователя и добавьте все роли, используя гем rolify.

avatar
debugabug
1 июля 2021 в 20:30
62
0
0

У меня есть система, настроенная с использованием devise и rolify для управления пользователями, однако мне нужно создать метод, в котором я могу сделать что-то вроде следующего:

[14] pry(main)> User.create_owner(username:"test", name:"Testing", password:"Password-1", password_confirmation:"Password-1", email: 'testing@hey.com')

который создает пользователя и дает ему все роли, которые у меня есть в системе.

Пока у меня есть следующее

def self.create_owner(options)
  user = self.new(options)

  @roles.each do |role, user|
    user.add_role?(role[:name])
  end

  user.has_role? :default
  user.save
end

но это то, что я получаю

NoMethodError: undefined method `each' for nil:NilClass
from /home/ben/code/BusinessCloudEssential/app/models/user.rb:291:in `create_owner'

Все роли были созданы с использованием исходного файла и находятся в базе данных в соответствии с документами Rolify.

РЕДАКТИРОВАТЬ ОК, теперь у меня есть следующее

def self.create_owner(options)
  user = self.new(options)

  Role.all.each do
    user.roles = Role.all
  end
  
  user.has_role? :default
  user.save
end

и следующий вывод

[1] pry(main)> User.create_owner(username:"test", name:"testing", password:"Password-1", password_confirmation:"Password-1", email: 'testing@hey.com')
  Role Load (2.6ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.4ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.5ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.4ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.3ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.3ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.3ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.5ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.3ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.3ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.3ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.3ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.3ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.6ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.3ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.3ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.3ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.3ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.3ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.2ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.2ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.3ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.2ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.2ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.3ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.3ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.4ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.3ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.3ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.3ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.3ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.4ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.4ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.8ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.6ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.4ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.4ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.3ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.3ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.4ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.4ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.4ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.9ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.3ms)  SELECT `roles`.* FROM `roles`
  Role Load (0.3ms)  SELECT `roles`.* FROM `roles`
  TRANSACTION (0.5ms)  BEGIN
  User Exists? (0.7ms)  SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY 'ben.bagley1@hey.com' LIMIT 1
  User Exists? (0.8ms)  SELECT 1 AS one FROM `users` WHERE `users`.`username` = 'ben1' LIMIT 1
  User Exists? (0.5ms)  SELECT 1 AS one FROM `users` WHERE `users`.`email` = 'ben.bagley1@hey.com' LIMIT 1
   (0.4ms)  SELECT COUNT(*) FROM `users`
  Setting Load (1.2ms)  SELECT `settings`.* FROM `settings` WHERE `settings`.`name` = 'number_of_users' LIMIT 1
  Setting Load (0.4ms)  SELECT `settings`.* FROM `settings` WHERE `settings`.`name` = 'number_of_users' LIMIT 1
  TRANSACTION (0.5ms)  ROLLBACK
TypeError: compared with non class/module
from /home/ben/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/activerecord-6.1.3.2/lib/active_record/relation/delegation.rb:108:in `>='
TypeError: compared with non class/module
from /home/ben/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/activerecord-6.1.3.2/lib/active_record/relation
Источник
engineersmnky
1 июля 2021 в 20:45
0

@rolls не установлено, возможно, вы искали Role.all? при этом 1) должно быть add_role? add_role 2) не будет ли user.roles= Role.all работать?

debugabug
2 июля 2021 в 08:15
0

Я обновлю код @engineersmnky, теперь я получаю TypeError: compared with non class/module

debugabug
2 июля 2021 в 08:19
0

Обновлено @engineersmnky

engineersmnky
2 июля 2021 в 14:26
0

Я не имел в виду оба. Либо Role.all.each {|role| user.add_role(role)}, либо user.roles = Rolls.all (в чем я не был уверен). Также эта строка user.has_role? :default ничего не делает

Ответы (0)