Ruby on rails as_json不在关联上调用as_json

Ruby on rails as_json不在关联上调用as_json,ruby-on-rails,json,ruby-on-rails-3,Ruby On Rails,Json,Ruby On Rails 3,我有一个模型,其中的数据在呈现为json时不应包含在内。因此,我实现了类“as_json”方法,以使其行为适当。问题是,当与此模型关联的其他模型呈现json时,不会调用我的自定义as_json class Owner < ActiveRecord::Base has_one :dog def as_json(options={}) puts "Owner::as_json" super(options) end end class Dog < Ac

我有一个模型,其中的数据在呈现为json时不应包含在内。因此,我实现了类“as_json”方法,以使其行为适当。问题是,当与此模型关联的其他模型呈现json时,不会调用我的自定义as_json

class Owner < ActiveRecord::Base
  has_one :dog

  def as_json(options={})
    puts "Owner::as_json"
    super(options)
  end  
end

class Dog < ActiveRecord::Base
  belongs_to :owner

  def as_json(options={})
    puts "Dog::as_json"
    options[:except] = :secret
    super(options)
  end  
end
类所有者
加载开发环境(Rails 3.0.3)
ruby-1.9.2-p136:001>d=Dog.first
=>
#
ruby-1.9.2-p136:002>d.as_json
狗::as_json
=>{“狗”=>{“id”=>1,“姓名”=>“史酷比”,“所有者id”=>1}}
ruby-1.9.2-p136:004>d.owner.as_json(:include=>:dog)
所有者::as_json
=>{“主人”=>{“id”=>1,“名字”=>“毛茸茸的”,狗=>{“id”=>1,“名字”=>“史酷比”,“主人id”=>1,“秘密”=>“我喜欢到处拉屎”}}


感谢您的帮助

这被报告为错误:

我遇到了相同的问题。我想让它起作用:

render :json => @favorites.as_json(:include => :location)
但事实并非如此,因此我最终添加了一个index.json.erb,其中包含以下内容:

<% favs = @favorites.as_json.each do |fav| %>
    <% fav["location"] = Location.find(fav["location_id"]).as_json %>
<% end %>
<%= favs.to_json.html_safe %>


不是修复-只是一个解决办法。我想你也做了同样的事情。

这是Rails中的一个例子。(由于从以前的bug追踪器迁移到Github的问题,该问题被标记为已关闭,但从Rails 3.1开始它仍然是一个问题。)

更新@John指出这是Rails中已知的bug。修复它的修补程序似乎是:at。尽管如此,你还是可以试试RABL,因为它很甜

我总是对传递一组复杂的选项来创建我想要的JSON视图感到失望。我在Rails 3.0.9中遇到的Mongoid问题促使我编写JSON模板。但实际上,如果您处理的是关系或自定义api属性,那么模板会更好。

此外,处理不同的输出对我来说就像是视图层,所以我决定使用API模板语言。它使构建有效的JSON和包含任何关联或字段变得非常容易


不是问题的解决方案,而是用例的更好解决方案。

如上所述,这是Rails基础的问题。rails补丁还没有应用,而且似乎至少有点争议,所以我不太愿意在本地应用它。即使作为猴子补丁应用,它也可能使未来rails升级复杂化

我还在考虑上面的建议,它看起来很有用。目前,我不想在我的应用程序中添加另一种视图模板语言。我目前的需求很小

所以这里有一个解决方案,它不需要补丁,适用于大多数简单的情况。当您希望调用的关联的
as_json
方法看起来像

def as_json(options={})
  super( <... custom options ...> )
end

如果您遵循以下指导原则:无论何时
:在
as_json()
方法中包含一个关联,您都可以在要引用的模型中将所需的任何选项定义为常量,这将适用于任意级别的关联注意我只需要在上述示例中定制的第一级关联。

我发现可序列化的\u散列与您预期的\u json一样工作,并且始终被称为:

  def serializable_hash(options = {})
    result = super(options)
    result[:url] = "http://.."
    result
  end

这实际上是一个不同的错误(不是专门针对相关模型),在3.0.2中得到了修复。在Rails 3.0.9上使用Mongoid时,我也遇到了这个问题。是的,迁移到Github的问题破坏了所有现有的链接(已修复。对于那些在这里寻找快速解决方法的人来说,它隐藏在注释中,但基本上,你可以通过将你的自定义命名为_json以可序列化_散列来解决问题。这是问题的实际解决方案。错误/“功能”仍然存在于Rails 5.1中,看起来不会得到修复。我在Rails 5.1.4上的测试表明这已不再是事实。
  def serializable_hash(options = {})
    result = super(options)
    result[:url] = "http://.."
    result
  end