Что может произойти, если я использую :less_protection => true при создании новой модели в рельсах 3.1? - PullRequest
6 голосов
/ 18 ноября 2011

Я столкнулся с проблемой в своем приложении и понял, что могу исправить ее, установив :without_protection => true при создании модели, например:

Model.new(params[:model], :without_protection => true). 

От чего именно рельсы защищают модели? Спасибо!

Ответы [ 2 ]

16 голосов
/ 18 ноября 2011

Это защита от непреднамеренного массового назначения.

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

Вы можете использовать attr_protected и attr_accessible в моделях для защиты атрибутов в ваших моделях, которые необходимо переопределить. Когда атрибут защищен, значение из params будет игнорироваться (уведомление появится в вашем журнале).

class Model < ActiveRecord::Base
  attr_accessible :one, :two
end

До Rails 3.1 это было так. Не было способа настроить его потом. Теперь с Rails 3.1 вы можете назначать роли:

class Model < ActiveRecord::Base
  attr_accessible :one, :two, :as => :admin
  attr_accessible :one, :as => :regular_user
end

И укажите это при массовых обновлениях (new или update_attributes):

Model.new(params[:model], :as => :regular_user)

Использование :without_protection сделает каждый атрибут свободным для назначения по массе и должен использоваться ОЧЕНЬ редко. Никогда не используйте, когда вы передаете данные пользователя. Например, вы можете использовать его в db/seeds.rb.

1 голос
/ 18 ноября 2011

Это защищает вас от массовых назначений.

Предположим, что ваша модель выглядит примерно так:

class CreditCard
  belongs_to :user
end

Вам бы не хотелось, чтобы кто-то вызывал ваше действие по обновлению creditcards_controller и передавал другой атрибут user_id в параметрах [: credit_card]

Подробнее о защите массовых назначений можно прочитать здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...