2

我使用 rails 作为backbone.js 站点的服务器端,因此我不断地来回传递rails 对象。

我注意到 rails 返回的错误WARNING: Can't mass-assign protected attributes: id, created_at, updated_at

当然,我觉得这很奇怪,因为我从来不需要包含这些字段据我所知,我的 json 看起来相当正常

参数:{"id"=>1, "updated_at"=>"2011-04-21T16:41:02Z"}, "created_at"=>"2012-02-23T21:01:02Z", "action"=> “测试更新”}
4

2 回答 2

7

您的 JSON 没有任何问题。问题是安全问题之一。默认情况下,Rails 保护某些属性不会被巨大的哈希创建或更新。这就是错误在使用术语“质量分配”时所指的内容。

您发布的 JSON:

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

包含 theidcreated_at字段updated_at。当将此 JSON 传递到操作中并在 a 中使用哈希时,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 并在一次调用中返回值。这并不理想,但它可以在紧要关头完成工作。

于 2012-02-24T18:29:03.750 回答
4

默认情况下,这些列受质量分配保护,不能手动设置。但是,您可以通过定义一个方法来覆盖此行为:

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

这将允许您created_at手动分配updated_at

于 2012-02-24T14:24:40.543 回答