В чем разница между attr_accessible (* атрибуты) и attr_protected (* атрибуты)? - PullRequest
35 голосов
/ 16 апреля 2010

В чем разница между attr_accessible(*attributes) & attr_protected(*attributes)? Примеры были бы хорошими.

Я вижу, что многие разработчики используют их в своих моделях. Я погуглил различия, но я не понимаю точно, что они есть. Какова важность и необходимость в разных сценариях?

Ответы [ 2 ]

99 голосов
/ 16 апреля 2010

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, которое возникает как исключение при попытке обновить защищенный атрибут.

7 голосов
/ 16 апреля 2010

attr_accessible - это белый список для массового назначения ...

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