Каково различие между attr_accessible (*attributes) и attr_protected (*attributes)?

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

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

35
задан Peter Mortensen 4 July 2014 в 22:05
поделиться

2 ответа

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

99
ответ дан 27 November 2019 в 06:32
поделиться

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
7
ответ дан 27 November 2019 в 06:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: