Я пытаюсь определить созданные пользователем роли, которые выбирают разрешения из списка разрешений. Я хочу такое разрешение:
def initialize(user)
user.projects_users.each do |project_user|
project_user.role.privileges do |privilege|
can :create, ProjectsUser, :project_id => project_user.project_id
end
end
end
Но я пытаюсь сохранить привилегии в базе данных таким образом, чтобы я мог сделать это, чтобы получить результат выше
def initialize(user)
user.projects_users.each do |project_user|
project_user.role.privileges do |privilege|
can privilege.action.to_sym, privilege.subject_class.constantize, privilege.conditions
end
end
end
Проблема заключается в части «привилегия.условия». Я не могу сохранить условие, которое должно выполняться только в файле Ability.rb. Если я попытаюсь сохранить:
{ :project_id => project_user.project_id }
Он сказал бы, что нет переменной с именем «project_user». Я мог бы сохранить его как строку и в моем файле возможностей сделать eval(privacy.condition), однако мне нужно было бы сделать это только для значений. Я пробовал что-то вроде этого:
def initialize(user)
user.projects_users.each do |project_user|
project_user.role.privileges do |privilege|
can privilege.action.to_sym, privilege.subject_class.constantize, privilege.conditions.each do |subject, id|
subject => eval(id)
end
end
end
end
Я получаю сообщение об ошибке: «синтаксическая ошибка, неожиданное =>, ожидание ключевого слова_end» для части «тема =>».
Не знаю, как именно это сделать...
Я использую эту строку команд для проверки:
@user_id = 4
@role = Role.create(name: "Tester", project_id: 4)
@priv = Privilege.create(:action => :create, :subject_class => 'ProjectsUser', :conditions => { :project_id => 'project_user.project_id' })
@role.privileges << @priv
@project_user = ProjectsUser.create(:user_id => @user_id, :role_id => @role.id, :project_id => @role.project_id)
@a = Ability.new(User.find(@user_id))
@a.can?(:create, ProjectsUser.new(:user_id => @user_id + 1, :role_id => @role.id, :project_id => @role.project_id))
Любой совет?