Я использую Rolify Gem в приложении Rails. Это работало хорошо до сегодняшнего дня. Я устанавливал webpacker и стимул и одновременно выполнял обновление Bundle. Это, кажется, сломало мою функциональность Rolify.
Внимательно изучил модель пользователя и сравнил ее с другим приложением, в котором Rolify все еще работает. Проверена ролевая модель, проверена схема базы данных, чтобы убедиться, что таблица users_roles не повреждена.
Есть ли что-нибудь в полиморфных отношениях, которое могло бы вызвать эту ошибку Аргумента?
Я прошу прощения, если этот вопрос не сформулирован правильно, я впервые задаю вопрос здесь.
u=User.find(1)
=> #<User id: 1, email: "admin@admin.com", created_at: "2019-04-27 17:13:17", updated_at: "2019-06-08 16:24:03", roles_mask: nil, first_name: "admin", last_name: "administrator", authentication_token: "V9rJdmKrhvZxVzBH55wk", email_frequency: nil, last_emailed: nil>
u.roles
Traceback (most recent call last):
ArgumentError (wrong number of arguments (given 3, expected 2))
Я получаю следующую ошибку: ArgumentError (неверное количество аргументов (задано 3, ожидается 2))
Пользователь:
class User < ApplicationRecord
validate :password_complexity
validates :last_name, presence: true
validates :first_name, presence: true
validates :email, presence: true
#default_scope { order("last_name, first_name")}
rolify
#has_and_belongs_to_many :roles, :join_table => :users_roles
has_many :cohorts_users, inverse_of: :user, dependent: :destroy
has_many :cohorts, :through => :cohorts_users
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
acts_as_token_authenticatable
devise :invitable, :database_authenticatable, #:registerable,
:recoverable, :rememberable, :trackable, :validatable
attr_accessor :skip_password_validation, :admin, :student, :rater, :author, :preceptor, :teacher, :auditor
attribute :email, :string
after_create :assign_default_role
def self.import(file, cohort)
cohort = Cohort.find(cohort.to_i)
spreadsheet = open_spreadsheet(file)
header = spreadsheet.row(1)
(2..spreadsheet.last_row).each do |i|
row = Hash[[header, spreadsheet.row(i)].transpose]
user = new
user.attributes = row.to_hash
user.skip_password_validation = true
user.cohorts << cohort
user.save!
#user.invite!
end
end
def self.open_spreadsheet(file)
case File.extname(file.original_filename)
when ".csv" then Roo::CSV.new(file.path)
when ".xls" then Roo::Excel.new(file.path)
when ".xlsx" then Roo::Excelx.new(file.path)
else raise "Unknown file type: #{file.original_filename}"
end
end
def password_required?
return false if skip_password_validation
super
end
def full_name
"#{last_name}, #{first_name}"
end
def assign_default_role
self.add_role(:candidate) if self.roles.blank?
end
private
def self.ransortable_attributes(auth_object = nil)
column_names - ['password_digest']
end
# Whitelist the User model attributes for search, except +password_digest+,
# as above. The +full_name+ ransacker below is included via +_ransackers.keys+
#
def self.ransackable_attributes(auth_object = nil)
ransortable_attributes + _ransackers.keys
end
def password_complexity
# Regexp extracted from https://stackoverflow.com/questions/19605150/regex-for-password-must-contain-at-least-eight-characters-at-least-one-number-a
return if password.blank? || password =~ /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,70}$/
errors.add :password, 'Complexity requirement not met. Length should be 8-70 characters and include: 1 uppercase, 1 lowercase, 1 digit and 1 special character'
end
# Demonstration of using a "ransacker" (a virtual, searchable "column") to
# allow searching via the full name from concatenated first and last names.
#
ransacker :full_name do |parent|
Arel::Nodes::InfixOperation.new('||',
Arel::Nodes::InfixOperation.new('||',
parent.table[:first_name], Arel::Nodes.build_quoted(' ')),
parent.table[:last_name])
end
end
Роль:
class Role < ApplicationRecord
has_and_belongs_to_many :users, :join_table => :users_roles
belongs_to :resource,
:polymorphic => true,
:optional => true
validates :resource_type,
:inclusion => { :in => Rolify.resource_types },
:allow_nil => true
def self.defined_roles
self.all.map { |role| role.name }
end
scopify
end