Подтвердить что ты не робот

Что такое массовое присвоение в Rails 3

Я слышал, как несколько человек жаловались и отправляли вопросы о массовом задании в Rails. У меня такая же ошибка пару раз, и все, что я делал, было attr_accessible. Но что такое массовое задание? может ли кто-нибудь объяснить на примере?

4b9b3361

Ответ 1

Массовое присвоение - это имя, которое Rails дает акту построения вашего объекта с помощью хэша параметров. Это "массовое присвоение" тем, что вы назначаете несколько значений атрибутам с помощью одного оператора присваивания.

Следующие фрагменты выполняют массовое присвоение атрибута name и topic модели Post:

Post.new(:name => "John", :topic => "Something")
Post.create(:name => "John", :topic => "Something")
Post.update_attributes(:name => "John", :topic => "Something")

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

Есть две ситуации, в которых это произойдет:

  • У вас есть объявление attr_accessible, которое не включает :name
  • У вас есть attr_protected, который включает :name

В последнее время стало по умолчанию, что атрибуты должны были быть вручную отмечены белым цветом с помощью attr_accessible для успешного выполнения массового присвоения. До этого значение по умолчанию предназначалось для назначения атрибутов, если они явно не были отмечены черным цветом attr_protected, или любой другой атрибут был отмечен белым цветом с помощью attr_acessible.

Важно учитывать, какие атрибуты могут быть назначены массой, потому что такой код настолько распространен:

@post = Post.new(params[:post])

Обычно это используется, когда пользователь отправляет форму, представленную form_for @post. В идеальном мире хеш params[:post] должен содержать только поля, которые мы отображали в форме. Тем не менее, пользователю легко передать дополнительные поля в свой запрос, так что вы позволяете пользователю устанавливать любые поля на @post, а не только те, которые отображаются в форме.

Неспособность использовать массовое присвоение привела к нескольким ошибкам высокого профиля в некоторых довольно крупных приложениях Rails, таких как тот, который позволил кому-то вводить свой собственный открытый ключ в список доверенных ключей в репозитории Github и нажать код непосредственно в репозиторий, к которому у них не должно было быть доступа.