Где и как назначить пользователя: роль администратора для attr_accessible в rails 3.1?

В руководстве Rails в разделе http://edgeguides.rubyonrails.org/security.html, раздел 6.1, он вводит роль attr_accessible с параметром: as,

attr_accessible :name, :is_admin, :as => :admin

Мой вопрос: если пользователь входит в систему, где и как я могу назначить пользователю: роль администратора, чтобы он/она получил право на массовое назначение с attr_accessible? Также я могу определить свою собственную роль, например group_to_update? Если это так, что должно входить в определение group_to_update?

Спасибо.

Ответ 1

Вы используете некоторую техническую терминологию неопределенными способами, из-за чего ваше понимание этого процесса запутывается, поэтому я сначала проясню эту терминологию.

где и как я могу назначить пользователю: роль администратора

"Роль", используемая в параметре :as для attr_accessible, не является ролью пользователя. Это роль атрибута. Это означает, что атрибут защищен от перезаписи, если эта роль не указана в инструкции, которая устанавливает атрибут. Таким образом, эта система не зависит от какой-либо пользовательской системы. Вашему приложению даже не нужно, чтобы пользователи имели роли в массовом назначении.

Могу ли я определить свою собственную роль, например group_to_update

Роли на самом деле не "определены" в каком-либо формальном смысле. В любом месте, где ожидается роль, просто используйте в качестве роли любой символ/строку (например, :group_to_update). Не нужно указывать его где-либо еще раньше.

Вот как это работает. Обычно при массовом назначении хэша для моделирования атрибутов все атрибуты модели используются как ключи к присвоенному хешу. Поэтому, если у вас есть экземпляр Barn и Barn его, с тремя атрибутами horse, cat и rabbit, тогда это:

barn.attributes = params

По сути, это то же самое, что и делать:

barn.horse = params[:horse]
barn.cat = params[:cat]
barn.rabbit = params[:rabbit]

Теперь, если вы установите любой attr_accessible в модели сарая, только те атрибуты, которые вы там установили, будут обновлены при использовании массового назначения. Пример:

class Barn < ActiveRecord::Base
    attr_accessible :cat
    attr_accessible :rabbit
end

Затем это:

barn.attributes = params

Будет делать только это:

barn.cat = params[:cat]
barn.rabbit = params[:rabbit]

Потому что только "кошка" и "кролик" доступны для доступа ( "лошадь" - нет). Теперь рассмотрим установку роли атрибута следующим образом:

class Barn < ActiveRecord::Base
    attr_accessible :cat
    attr_accessible :rabbit, :as => :banana
end

Во-первых, обратите внимание, что роль может быть любым, что угодно, если это символ/строка. В этом случае я сделал роль :banana. Теперь, когда вы устанавливаете роль в атрибуте attr_accessible, он обычно не присваивается. Это:

barn.attributes = params

Теперь будет делать следующее:

barn.cat = params[:cat]

Но вы можете назначать атрибуты с использованием определенной роли с помощью метода assign_attributes. Итак, вы можете сделать:

barn.assign_attributes(params, :as => :banana)

Это назначит все нормально защищенные параметры, а также все параметры, защищенные в роли :banana:

barn.cat = params[:cat]
barn.rabbit = params[:rabbit]

Итак, рассмотрим более длинный пример с большим количеством атрибутов:

class Barn < ActiveRecord::Base
    attr_accessible :cat
    attr_accessible :rabbit, :as => :banana
    attr_accessible :horse, :as => :banana
    attr_accessible :cow, :as => :happiness
end

Затем вы можете использовать эти роли при назначении атрибутов. Это:

barn.assign_attributes(params, :as => :banana)

Соответствует:

barn.cat = params[:cat]
barn.rabbit = params[:rabbit]
barn.horse = params[:horse]

И это:

barn.assign_attributes(params, :as => :happiness)

Соответствует:

barn.cat = params[:cat]
barn.cow = params[:cow]

Теперь, если вы решите, вы можете сделать роли пользователя (например, столбец "роль" в вашей модели пользователя) соответствовать ролям атрибутов в любой модели. Таким образом, вы можете сделать что-то вроде этого:

barn.assign_attributes(params, :as => user.role)

Если эта роль user оказывается banana, то (используя наш последний пример модели) она установит атрибуты на сарай для кошки, кролика и лошади. Но это всего лишь один способ использования ролей атрибутов. Это зависит только от вас, если вы хотите использовать их по-другому.

Ответ 2

Это защита от массового присвоения, как объясняет ваша ссылка.

В рельсах (для обновления) это влияет только на вызов update_attributes. Вы можете использовать update_attribute или admin = методы для назначения административной переменной.

User.first.update_attributes(:name => "Gazler", :admin => true) #this will not work
User.first.update_attribute(:admin, true) #This will work

#This will also work
user = User.first
user.admin = true
user.save

Возможно, вам стоит взглянуть на использование gem для ваших прав доступа. Cancan, вероятно, самый распространенный.

Ответ 3

Посмотрите на метод assign_attributes.

Вкратце, он позволяет присваивать атрибуты только тогда, когда вы также передаете роль. Документы имеют очень приятные и легко понятные примеры кода. В некотором смысле, он работает как фильтр или защитник.