我使用rails作为backbone.js站点的服务器端,因此我不断地来回传递rails对象。
我注意到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"}
答案 0 :(得分:7)
您的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(解决有关传回ID的评论):
如果您正在使用Rails REST模型并调用controller /:id / action url,则无需传回ID,因为该信息已嵌入URL中。它可以通过params[:id]
访问,哈希通过params[:model_name]
访问(遵循Rails模型)。
如果你正在做一些不同的事情并且ID 必须在传回的JSON中,那么你可以简单地执行id = params[:model_name][:id].delete
,这将从哈希中删除id并返回值在一个电话中。这不是理想的,但它可以在紧要关头完成工作。
答案 1 :(得分:3)
默认情况下,这些列受质量分配保护,无法手动设置。但是,您可以通过定义方法来覆盖此行为:
def self.attributes_protected_by_default
[] # ["created_at", "updated_at" ..other]
end
这样您就可以手动分配created_at
和updated_at
。