attr_accessible
( документация ) говорит, что "указанные атрибуты доступны, а все остальные защищены" (воспринимайте это как белый список .)
тогда
attr_protected
( документация ) говорит, что "указанные атрибуты защищены, а все остальные доступны" (воспринимайте это как черный список .)
A защищенный атрибут - это атрибут, который может быть изменен только явно (например, с помощью attribute = ) и не может быть обновлен с помощью массового назначения (например, с помощью model.update_attributes
или путем передачи атрибуты new
). Поведение при попытке обновить защищенный атрибут с помощью массового назначения зависит от настройки mass_assignment_sanitizer
(см. Обновление ниже).
Классическим примером может быть, если модель User
имеет атрибут is_admin
, вы можете защитить этот атрибут, чтобы предотвратить отправку форм, позволяющую любому пользователю быть назначенным администратором.
пример:
class User < ActiveRecord::Base
# explicitly protect is_admin, any new attributes added to the model
# in future will be unprotected so we need to remember to come back
# and add any other sensitive attributes here in the future
attr_protected :is_admin
end
по сравнению с:
class User < ActiveRecord::Base
# explicitly unprotect name and bio, any new attributes added to the model
# in the future will need to be listed here if we want them to be accessible
attr_accessible :name, :bio
end
Теперь при условии, что is_admin
атрибут защищен:
> u = User.find_by_name('mikej')
> u.is_admin?
false
> u.update_attributes(:name => 'new name', :is_admin => true)
> u.is_admin?
false
> u.name
"new name"
> u.is_admin = true # setting it explicitly
> u.save
> u.is_admin?
true
Обновление: в более поздних версиях Rails была введена концепция дезинфицирующего средства массового назначения для управления поведением при попытках обновить защищенные атрибуты с помощью массового назначения. В Rails 3.2 и более поздних версиях этим можно управлять, установив mass_assignment_sanitizer
в config. По умолчанию ведется лог попыток и разрешение продолжения выполнения кода, но стандартная конфигурация среды для разработки задает для этого параметра значение :strict
, которое возникает как исключение при попытке обновить защищенный атрибут.