Я слышал, как несколько человек жаловались и отправляли вопросы о массовом задании в Rails. У меня такая же ошибка пару раз, и все, что я делал, было attr_accessible
. Но что такое массовое задание? может ли кто-нибудь объяснить на примере?
Что такое массовое присвоение в Rails 3
Ответ 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 и нажать код непосредственно в репозиторий, к которому у них не должно было быть доступа.