为模型实例对象创建属性的最佳方法

时间:2013-04-23 20:44:05

标签: ruby-on-rails ruby ruby-on-rails-3 model

我正在为iPhone应用程序的后端构建一个Rails服务器。 Rails将JSON发送到前端,我发现自己正在做这样的事情。

@user = User.find(1)

@user["status"] = "Some cool status"

render :json => @user.to_json

在我的rspec测试中,我得到了

DEPRECATION WARNING: You're trying to create an attribute `status'. Writing arbitrary attributes on a model is deprecated. Please just use `attr_writer` etc.

我发现很难找到一个合适的选择,因为将一个键值写入将发送到iPhone的对象同样容易。

我的问题是,除了弃用之外,我正在尝试做什么以及我的代码特别“错误”的替代方案是什么。

1 个答案:

答案 0 :(得分:1)

您可以将User对象转换为哈希值,然后将其他键混合到其中:

class User
    def to_hash
        hash = {}
        instance_variables.each {|var| hash[var.to_s.delete("@")] = instance_variable_get(var) }
        hash
    end
end

在你的控制器中:

user = User.find(1)

user = user.to_hash

user[:status] = "Some cool status"

render :json => user.to_json

PS。无论如何渲染json都不需要使用实例变量@user,本地user变量就足够了。