dav*_*rac 2 api rest json ruby-on-rails ruby-on-rails-3
我正在使用火箭裤来渲染我的JSON API.
我试图通过在我的模型中重写as_json来改变它呈现JSON的方式,但不知何故,似乎没有改变火箭裤响应中的任何东西.
在我的控制器中:
class Api::V1::ProjectsController < RocketPants::Base
...
def show
expose Project.find(params[:id])
end
...
end
Run Code Online (Sandbox Code Playgroud)
在我的模型中:
class Project < ActiveRecord::Base
...
def as_json(options = {})
{"this" => "is not working!"}
end
...
end
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
此外,还有第一组选项可以发送到公开块.根据源,您可以将选项传递给serializable_hash方法.例如:
expose user, only: [:name, :email]
这将使用名称和电子邮件调用对象上的serializable_hash.
您还可以在此一组选项中指定预先加载.例如:
expose uploads, :include => { :user => { :only => :username } }.
这将公开您的上传并急切加载与用户的belongs_to关联.
资料来源:https://github.com/filtersquad/rocket_pants/issues/20#issuecomment-6347550
我已经想出如何做到这一点.火箭裤的工作方式是通过观察serializable_hash方法.覆盖它会导致响应发生变化.
编辑:
我得到的解决方案:
在我需要添加一些属性的模型中:简单地覆盖属性方法:
# Overriding this method is required for the attribute to appear in the API
def attributes
info = {} # add any logic that fits you
super.merge info
end
Run Code Online (Sandbox Code Playgroud)
在需要公开API的控制器中,我创建了一个新的Model类(这只是为了保留不同的API版本),并重写了serializable_hash方法:
class Location < ::Location
def serializable_hash(options = {})
super only: [:id, :lat, :long],
include: [user: {only: ...your attributes here...}]
end
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2139 次 |
| 最近记录: |