Использование Rails 3.1: as =>: admin для обновления атрибутов, защищенных attr_accessible - PullRequest
11 голосов
/ 10 января 2012

После прочтения о attr_accessible в Rails 3.1 API я вижу, что там есть опция as :admin. Я хотел бы знать две вещи.

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

  2. Если пользователь является владельцем, могу ли я указать :as => owner в моей модели и еще раз, как мой контроллер сообщает моей модели, что они являются владельцем предмета.

Ответы [ 3 ]

18 голосов
/ 10 января 2012

Нет встроенной интеграции с моделями;Вы передаете роль в вызове 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 содержит больше информации .

3 голосов
/ 10 января 2012

Для обоих сценариев вы передадите его так же, как вы его объявили изначально.Так, например:

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

1 голос
/ 12 сентября 2014

все атрибуты, к которым вы хотите обратиться как конкретный пользователь, должны быть определены правильно.Например:

    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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...