Использование 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)