带有时间戳字段的ActiveResource MassAssignmentSecurity错误

时间:2013-02-11 13:06:48

标签: ruby-on-rails ruby oop

我正在尝试在rails模型上使用ActiveResource实现基本的CRUD操作。 文档说明要创建ActiveResource::Base的子类,然后设置self.site

这很好用直到我尝试更新已经获取的现有记录。 我看到的错误是“MassAssignmentSecurity::Error”,当我在ActiveResource对象上调用'save()'方法时,由于created_atupdated_at字段无法访问而出现。

我发现如果在我的模型类上使用attr_accessible标记这些字段就可以了,但这似乎是一种非常不安全且非常差的解决方案。
下面显示了该问题的一个示例:

rails new TestApp
cd TestApp
rails generate scaffold User first:string last:string
rake db:create
rake db:migrate
rails server

在我使用的另一个终端标签上:

irb
require 'active_resource'
class User < ActiveResource::Base
self.site = 'http://localhost:3000'
end
u = User.new()
u.first = 'John'
u.last = 'Shine'
u.save()
#This saves ok
nu = User.find(1)
nu.first = 'Geoff'
nu.save() 
#This never works

有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

假设您要丢弃Timestamp字段并让rails自动创建它们(正常情况下),我将从应用程序内部的新json / xml模板获取数据,该模板不包含Timestamp字段。

另外假设您可以访问提供数据的应用程序,您可以将以下内容添加到您的rails模型中进行测试,它会覆盖(可以称之为'使用')json模板的as_json方法。

def as_json(options = {})
  super(:except => [:created_at, :updated_at])
end

这将由rails服务器本身更新时间戳文件。

或者你应该看看RABL和jbuilder,因为两者都是不错的选择。