首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Rails3中定制to_json响应

如何在Rails3中定制to_json响应
EN

Stack Overflow用户
提问于 2010-09-15 23:13:16
回答 3查看 14K关注 0票数 16

我正在使用respond_with,所有的东西都被正确地连接起来,以正确地获取数据。我想以一种干式的方式定制返回的jsonxmlfoobar格式,但是我不知道如何使用有限的:only:include来做到这一点。当数据很简单时,它们很棒,但对于复杂的查找,它们达不到我想要的。

假设我有一个帖子,上面的has_many图片

代码语言:javascript
复制
def show
  @post = Post.find params[:id]
  respond_with(@post)
end

我希望在响应中包含图像,这样我就可以这样做:

代码语言:javascript
复制
def show
  @post = Post.find params[:id]
  respond_with(@post, :include => :images)
end

但我并不是真的想发送整个图像对象,只发送url。除此之外,我真的希望能够做这样的事情(伪代码):

代码语言:javascript
复制
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中加入了一些我没有意识到的东西来处理这种行为。想法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-17 13:06:58

它不是Rails3的内置方式,但我发现了一个在Rails3上积极维护的很棒的宝石:acts_as_api

票数 7
EN

Stack Overflow用户

发布于 2011-01-26 19:18:13

您可以在模型中覆盖as_json。类似于:

代码语言:javascript
复制
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等)

票数 21
EN

Stack Overflow用户

发布于 2011-02-09 07:15:09

可能太晚了,但我在rails文档中找到了一个更干练的解决方案。这在我的简短测试中是有效的,但可能需要一些调整:

代码语言:javascript
复制
# 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等是安全的。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3719041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档