Использование Rails 3.1: as =>: admin для обновления атрибутов, защищенных attr_accessible
После прочтения attr_accessible в API Rails 3.1, я вижу, что есть опция :admin
. Я хотел бы знать две вещи.
-
Если у пользователя есть флаг администратора, как мой контроллер указывает моей модели, что пользователь является администратором.
-
Если пользователь является владельцем, могу ли я указать :as => owner
в моей модели, и еще раз, как мой контроллер сообщает моей модели, они являются владельцем элемента.
Ответы
Ответ 1
Нет встроенной интеграции с моделями; вы передаете роль в вызове assign_attributes
:
@project.assign_attributes(params[:project], :as => :admin)
Параметр :as
по умолчанию равен :default
, и вы можете передать любой символ, который вы хотите. Чтобы интегрировать это в вашу модель User
, вы можете присвоить ей атрибут role
, а затем сделать что-то вроде:
@project.assign_attributes(params[:project], :as => current_user.role.to_sym)
Вы также можете обойти защиту с помощью :without_protection
:
@project.assign_attributes(params[:project], :without_protection => true)
Подобным образом методы new
, create
, create!
, update_attributes
и update_attributes!
все относятся к безопасности присвоения массового присвоения. В Руководство по Ruby on Rails по безопасности подробнее.
Ответ 2
В обоих сценариях вы передадите его так же, как вы его изначально объявляете. Так, например:
class User < ActiveRecord::Base
attr_accessible :name
attr_accessible :credit_card, :as => :admin
end
Если вы сделали
user = User.new(:name => "John", :credit_card => "1234123412341234")
Тогда вы не сможете назначить credit_card
:
user.attributes # {:name => "John", :credit_card => nil}
Однако, если вы укажете, что он будет :as => :admin
, тогда он позволяет ему
user = User.new({:name => "John", :credit_card => "1234123412341234"}, :as => :admin)
user.attributes # {:name => "John", :credit_card => "1234123412341234"}
Дополнительная информация:
http://www.enlightsolutions.com/articles/whats-new-in-edge-scoped-mass-assignment-in-rails-3-1
Ответ 3
все атрибуты, которые вы хотите получить в качестве конкретного пользователя, должны быть правильно определены. Например:
class User < ActiveRecord::Base
attr_accessible :name
attr_accessible :credit_card, :as => :admin
end
Это показало ошибку для меня.
Но когда я изменил его на
class User < ActiveRecord::Base
attr_accessible :name
attr_accessible :name, :credit_card, :as => :admin
end
Это отлично работало, когда я использовал
@user.update_attributes(params[:user], :as => :admin)