Между чем различие attr_accessible(*attributes)
& attr_protected(*attributes)
? Примеры были бы хороши.
Я вижу, что многие разработчики используют их в своих моделях. Я погуглил для различий, но я не получаю точно, каковы они. Каковы важность и ее необходимость в различных сценариях?
attr_accessible
( документация ) говорит, что «указанные атрибуты доступны, а все остальные защищены» (воспринимайте это как белый список .)
тогда как
attr_protected
( документация ) говорит, что «указанные атрибуты защищены, а все остальные доступны» (воспринимайте это как черный список .)
Защищенный атрибут - это атрибут, который может быть изменен только явно (например, с помощью attribute = ) и не может быть обновлен с помощью массового назначения (например, с помощью model.update_attributes
или передав атрибуты в new
). Поведение при попытке обновить защищенный атрибут посредством массового назначения зависит от настройки mass_assignment_sanitizer
(см. Обновление ниже).
Классический пример: если бы модель Пользователь
имела атрибут 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
, которое возникает как исключение при попытке обновить защищенный атрибут.
attr_accessible is белый список для массового назначения ...
class Foo < ActiveRecord::Base #has attributes foo and bar
attr_accessible :foo
end
f = Foo.new :foo => "test", :bar => "test"
f.foo #=> "test"
f.bar #=> nil
attr_proteceted - черный список для массового назначения ...
class Foo < ActiveRecord::Base #has attributes foo and bar
attr_protected :bar
end
f = Foo.new :foo => "test", :bar => "test"
f.foo #=> "test"
f.bar #=> nil