Rails 3.1 attr_accessible верификация получает массив ролей - PullRequest
4 голосов
/ 22 сентября 2011

Я хотел бы использовать rails новую динамическую функцию attr_accessible. Однако у каждого из моих пользователей много ролей (я использую декларативную авторизацию). Итак, у меня есть следующее в моей модели:

class Student < ActiveRecord::Base

attr_accessible :first_name, :as=> :admin

end

и я передаю это в моем контроллере:

@student.update_attributes(params[:student], :as => user_roles)

user_roles - это массив символов:

   user_roles = [:admin, :employee]

Я бы хотел, чтобы моя модель проверила, совпадает ли один из символов в массиве с объявленным attr_accessible. Поэтому я избегаю дублирования.

Например, учитывая, что user_roles = [: admin,: employee]. Это работает:

@student.update_attributes(params[:student], :as => user_roles.first)

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

Любая помощь будет принята с благодарностью

************** * UPDATE ************ ************

Пример приложения можно скачать здесь: https://github.com/jalagrange/roles_test_app

В этом приложении есть 2 примера: учащиеся, у которых y не может обновить какие-либо атрибуты, несмотря на то, что 'user_roles = [: admin,: student]'; И люди, в которых я могу изменить только имя, потому что я использую "user_roles.first" в действии обновления контроллера. Надеюсь это поможет. Я уверен, что кто-то еще должен иметь эту проблему.

1 Ответ

1 голос
/ 25 сентября 2011

Вы можете выполнить monkey-patch Модуль массового назначения ActiveModel следующим образом:

# in config/initializers/mass_assignment_security.rb

module ActiveModel::MassAssignmentSecurity::ClassMethods

  def accessible_attributes(roles = :default)
    whitelist = ActiveModel::MassAssignmentSecurity::WhiteList.new
    Array.wrap(roles).inject(whitelist) do |allowed_attrs, role|
      allowed_attrs + accessible_attributes_configs[role].to_a
    end
  end

end

Таким образом, вы можете передать массив как параметр :as в update_attributes

Обратите внимание, что это может прерваться, если accessible_attrs_configs содержит BlackList (от использования attr_protected)

...