我正在使用respond_with
,所有的东西都被正确地连接起来,以正确地获取数据。我想以一种干式的方式定制返回的json
、xml
和foobar
格式,但是我不知道如何使用有限的:only
和:include
来做到这一点。当数据很简单时,它们很棒,但对于复杂的查找,它们达不到我想要的。
假设我有一个帖子,上面的has_many
图片
def show
@post = Post.find params[:id]
respond_with(@post)
end
我希望在响应中包含图像,这样我就可以这样做:
def show
@post = Post.find params[:id]
respond_with(@post, :include => :images)
end
但我并不是真的想发送整个图像对象,只发送url。除此之外,我真的希望能够做这样的事情(伪代码):
def show
@post = Post.find params[:id]
respond_with(@post, :include => { :foo => @posts.each.really_cool_method } )
end
def index
@post = Post.find params[:id]
respond_with(@post, :include => { :foo => @post.really_cool_method } )
end
…但这一切都是以一种枯燥的方式。在较早的rails项目中,我曾使用xml构建器来定制输出,但是在json、XML、html之间复制它似乎是不正确的。我不得不想象,rails专家在Rails 3中加入了一些我没有意识到的东西来处理这种行为。想法?
发布于 2010-09-17 13:06:58
它不是Rails3的内置方式,但我发现了一个在Rails3上积极维护的很棒的宝石:acts_as_api
发布于 2011-01-26 19:18:13
您可以在模型中覆盖as_json
。类似于:
class Post < ActiveRecord::Base
def as_json(options = {})
{
attribute: self.attribute, # and so on for all you want to include
images: self.images, # then do the same `as_json` method for Image
foo: self.really_cool_method
}
end
end
在使用respond_with
时,Rails会处理剩下的事情。不完全确定options
设置为什么,但可能是您为respond_with
提供的选项(:include
、:only
等)
发布于 2011-02-09 07:15:09
可能太晚了,但我在rails文档中找到了一个更干练的解决方案。这在我的简短测试中是有效的,但可能需要一些调整:
# This method overrides the default by forcing an :only option to be limited to entries in our
# PUBLIC_FIELDS list
def serializable_hash(options = nil)
options ||= {}
options[:only] ||= []
options[:only] += PUBLIC_FIELDS
options[:only].uniq!
super(options)
end
这基本上允许您拥有一个允许用于公共API的字段列表,并且您不能意外地公开整个对象。您仍然可以手动公开特定字段,但默认情况下,您的对象对于.to_json、.to_xml等是安全的。
https://stackoverflow.com/questions/3719041
复制相似问题