Rails无法为id,created_at大量分配受保护的属性

时间:2012-02-24 14:16:55

标签: ruby-on-rails activerecord mass-assignment

我使用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"}

2 个答案:

答案 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_atupdated_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_atupdated_at