English 中文(简体)
如何建立由多个铁路模型组成的JSON对策
原标题:How to build a JSON response made up of multiple models in Rails

First, the desired result

页: 1 我愿就此做出回应。

{
  "user":
    {"username":"Bob!","foo":"whatever","bar":"hello!"},

  "items": [
    {"id":1, "name":"one", "zim":"planet", "gir":"earth"},
    {"id":2, "name":"two", "zim":"planet", "gir":"mars"}
  ]
}

然而,我的<代码>User和Item模式的属性大于这些属性。 我找到了做到这一点的途径,但beware,这并不好。 请帮助......

Update

下一节载有原始问题。 最后一节显示了新的解决办法。


My hacks

home_controller.rb

class HomeController < ApplicationController

  def observe
    respond_to do |format|
      format.js { render :json => Observation.new(current_user, @items).to_json }
    end
  end

end

observation.rb

# NOTE: this is not a subclass of ActiveRecord::Base
# this class just serves as a container to aggregate all "observable" objects
class Observation
  attr_accessor :user, :items

  def initialize(user, items)
    self.user = user
    self.items = items
  end

  # The JSON needs to be decoded before it s sent to the `to_json` method in the home_controller otherwise the JSON will be escaped...
  # What a mess!
  def to_json
    {
      :user => ActiveSupport::JSON.decode(user.to_json(:only => :username, :methods => [:foo, :bar])),
      :items => ActiveSupport::JSON.decode(auctions.to_json(:only => [:id, :name], :methods => [:zim, :gir]))
    }
  end
end

Look Ma! No more hacks!

Override as_json instead

ActiveRecord:Serialization#as_json 很粗略。 概述:

as_json(options = nil) 
  [show source]

关于<代码>to_json <>/code> vs as_json 的更多信息,见的公认答复。 2.3.5

The code sans hacks

user.rb

class User < ActiveRecord::Base

  def as_json(options)
    options = { :only => [:username], :methods => [:foo, :bar] }.merge(options)
    super(options)
  end

end

item.rb

class Item < ActiveRecord::Base

  def as_json(options)
    options = { :only => [:id, name], :methods => [:zim, :gir] }.merge(options)
    super(options)
  end

end

home_controller.rb

class HomeController < ApplicationController

  def observe
    @items = Items.find(...)
    respond_to do |format|
      format.js do
        render :json => {
          :user => current_user || {},
          :items => @items
        }
      end
    end
  end

end
最佳回答
问题回答

如果有人正在寻找替代解决办法,这就是我如何解决这一铁路问题4.2:

def observe
  @item = some_item
  @user = some_user

  respond_to do |format|
    format.js do
      serialized_item = ItemSerializer.new(@item).attributes
      serialized_user = UserSerializer.new(@user).attributes
      render :json => {
        :item => serialized_item, 
        :user => serialized_user
      }
    end
  end
end

这两条物体的序列号为JSON,可在response.user/code>和response.item上查阅。

现在建造JSON有许多新的宝石,就本案而言,我发现最合适的是Jsonies:

https://github.com/bsiggelkow/jsonify https://github.com/bsiggelkow/jsonify-rails

这使你能够从自己的模式中积累各种特性和阵列。

www.un.org/Depts/DGACM/index_spanish.htm 工作文件2 为了避免将你的json“替罪羊”问题逐手地建立数据结构,然后打电话到once<>。 它可以有一点字眼,但你可以在控制器上做,或者将其引向单个模型,如<代码>to_hash<>/code>或某种。

def observe
  respond_to do |format|
    format.js do
      render :json => {
        :user => {:username => current_user.username, :foo => current_user.foo, :bar => current_user.bar},
        :items => @items.collect{ |i| {:id => i.id, :name => i.name, :zim => i.zim, :gir => i.gir} }
      }
    end
  end
end




相关问题
rails collection_select vs. select

collection_select and select Rails helpers: Which one should I use? I can t see a difference in both ways. Both helpers take a collection and generates options tags inside a select tag. Is there a ...

SSL slowness in EC2

We ve deployed our rails app to EC2. In our setup, we have two proxies on small instances behind round-robin DNS. These run nginx load balancers for a dynamically growing and shrinking farm of web ...

Auth-code with A-Za-z0-9 to use in an URL parameter

As part of a web application I need an auth-code to pass as a URL parameter. I am currently using (in Rails) : Digest::SHA1.hexdigest((object_id + rand(255)).to_s) Which provides long strings like : ...

RubyCAS-Client question: Rails

I ve installed RubyCAS-Client version 2.1.0 as a plugin within a rails app. It s working, but I d like to remove the ?ticket= in the url. Is this possible?

activerecord has_many :through find with one sql call

I have a these 3 models: class User < ActiveRecord::Base has_many :permissions, :dependent => :destroy has_many :roles, :through => :permissions end class Permission < ActiveRecord::...

Ordering a hash to xml: Rails

I m building an xml document from a hash. The xml attributes need to be in order. How can this be accomplished? hash.to_xml

Text Editor for Ruby-on-Rails

guys which text editor is good for Rubyonrails? i m using Windows and i was using E-Texteditor but its not free n its expired now can anyone plese tell me any free texteditor? n which one is best an ...

How to get SQL queries for each user where env is production

I’m developing an application dedicated to generate statistical reports, I would like that user after saving their stat report they save sql queries too. To do that I wrote the following module: ...