Где и как назначить пользователю роль администратора для attr работает в Rails 3.1?
в направляющих направляющих в http://edgeguides.rubyonrails.org/security.html, раздел 6.1, он вводит роль для attr_accessible с: as option,
attr_accessible :name, :is_admin, :as => :admin
мой вопрос: если пользователь входит в систему, где и как я могу назначить пользователю :роль администратора, чтобы он/она получил право на массовое назначение с помощью attr_accessible? Также я могу определить свою собственную роль, такую как group_to_update? Если да, то что должно входить в определение group_to_update?
спасибо.
3 ответов
вы используете некоторую техническую терминологию неопределенными способами, что делает ваше понимание этого процесса запутанным, поэтому я собираюсь сначала прояснить эту терминологию.
где и как я могу назначить пользователя: роль администратора
"роль", используемая в до 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
, затем (используя наш последний пример модели) он установит атрибуты на сарае для кошки, кролика и лошади. Но это лишь один из способов использования атрибутивных ролей. Это полностью зависит от вас, если вы хотите использовать их иным способом.
Это для защиты от массового назначения, как объясняет ваша ссылка.
в rails (для обновления) это влияет только на update_attributes звонок. Вы все еще можете использовать update_attribute или admin= методы назначения переменной 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
возможно, вы захотите взглянуть на использование драгоценный камень для ваших разрешений. Канкан вероятно, самый распространенный.
посмотреть assign_attributes метод.
короче говоря, это позволяет вам присваивать атрибуты только тогда, когда вы также передаете роль. Врачи есть очень хорошие и понятные примеры кода. В некотором смысле, это работает как своего рода фильтр, или охранник.