And*_*rew 0 json ruby-on-rails active-model-serializers
使用Rails 3.2,我正在研究API支持的模型(不是ActiveRecord).我希望能够to_json在Rails控制器中调用此模型.在阅读了一堆ActiveModel文档后,我仍然不清楚一件事:
鉴于这样的模型:
class MyModel
attr_accessor :id, :name
def initialize(data)
@id = data[:id]
@name = data[:name]
end
def as_json
{id: @id, name: @name}
end
end
Run Code Online (Sandbox Code Playgroud)
这应该按预期工作,还是我还需要包含ActiveModel::Serializers::JSON?我很难搞清楚as_json/ to_json方法通常定义的位置以及Rails何时在不同情况下自动调用哪些方法...
感谢您的任何见解!
是的,这确实有效,但不会像你写的那样引用.
使用时在控制器中渲染json
def action
render :json => @my_model
end
Run Code Online (Sandbox Code Playgroud)
然后Rails将自动调用to_json您的对象,只要您已定义to_json它将按预期工作.
如果您的控制器使用Rails 3内容协商shenanigans,即.
class Controller < ApplicationController
respond_to :json, :html
def action
respond_with(@my_model)
end
Run Code Online (Sandbox Code Playgroud)
然后你需要覆盖as_json你的类,但是方法签名需要一个可选的hash选项以与ActiveSupport兼容,所以在这种情况下你想要
def as_json(options={})
...
end
Run Code Online (Sandbox Code Playgroud)
或者,如果你包含ActiveModel::Serializers::JSON在你的类中,并且你的类支持attributes返回attrs散列及其值的方法 - 那么你将获得as_json免费 - 但如果你只是手动覆盖方法,则无法控制结果结构.
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
1142 次 |
| 最近记录: |