Rails не может массово назначать защищенные атрибуты для id, create_at - PullRequest
2 голосов
/ 24 февраля 2012

Я использую rails в качестве серверной части сайта backbone.js, поэтому я постоянно передаю объекты rails взад и вперед.

Я замечаю ошибки в возвращаемых рельсах WARNING: Can't mass-assign protected attributes: id, created_at, updated_at.

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

 Parameters: {"id"=>1, "updated_at"=>"2011-04-21T16:41:02Z"},  "created_at"=>"2012-02-23T21:01:02Z", "action"=>"test update"}

Ответы [ 2 ]

7 голосов
/ 24 февраля 2012

В вашем JSON нет ничего плохого. Вопрос в безопасности. Rails по умолчанию защищает определенные атрибуты от создания или обновления из гигантского хеша. Это то, к чему относится ошибка, когда используется термин «массовое назначение».

JSON, который вы разместили:

Parameters: {"id"=>1, "updated_at"=>"2011-04-21T16:41:02Z"}, "created_at"=>"2012-02-23T21:01:02Z", "action"=>"test update"}

содержит поля id, created_at и updated_at. Когда этот JSON передается в действие и хэш используется в model_object.update_attributes(hash_fields), вы получите эту ошибку. Чтобы избежать этой ошибки, вы можете удалить поля из хэша и назначить их позже, или, в идеале, позволить ActiveRecord работать для вас просто волшебно и просто игнорировать их.

Если вам действительно нужно назначить их, вы можете сделать это следующим образом:

 model_object.id = id_variable
 model_object.created_at = created_at_variable
 model_object.updated_at = updated_at_variable
 model_object.save

EDIT1 (чтобы ответить на комментарий о возврате идентификатора):

Если вы используете REST-модель Rails и вызываете контроллер /: id / action url, вам не нужно передавать ID обратно, так как эта информация уже встроена в URL. Доступ к нему можно получить через params[:id], а хеш - через params[:model_name] (по модели Rails).

Если вы делаете что-то другое, и идентификатор должен находиться в JSON, передаваемом обратно, тогда вы можете просто сделать id = params[:model_name][:id].delete, и это удалит идентификатор из хеша и вернет значение за один вызов , Это не идеально, но это может сделать работу в крайнем случае.

3 голосов
/ 24 февраля 2012

Эти столбцы по умолчанию защищены для массового назначения и не могут быть установлены вручную. Но вы можете переопределить это поведение, определив метод:

def self.attributes_protected_by_default
  [] # ["created_at", "updated_at" ..other]
end

Это позволит вам назначить created_at и updated_at вручную.

...