11

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

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

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

ответ

18

Нет встроенной интеграции с моделями; вы передаете роль в assign_attributes вызова:

@project.assign_attributes(params[:project], :as => :admin) 

The :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 guide on security имеет more info.

+0

У меня есть вопрос, хотя.Я обновляю Rails 4 до 5 (ранее это было на Rails 3. и я встретил что-то вроде '@ project.update_attributes (params [: project],: as => current_user.role.to_sym)' но но я получите сообщение об ошибке, в котором говорится, что 'update_attributes' принимает только один аргумент. Что случилось с частью' as:: admin' этого кода? Безопасно ли его полностью удалить? – Emanuel

3

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

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

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

class User < ActiveRecord::Base 
    attr_accessible :name 
    attr_accessible :credit_card, :as => :admin 
    end 

Это показало ошибку для меня. Но когда я modied его

class User < ActiveRecord::Base 
    attr_accessible :name 
    attr_accessible :name, :credit_card, :as => :admin 
    end 

Это работало хорошо, когда я использовал

@user.update_attributes(params[:user], :as => :admin)