Rails控制器来自两个模型的response_with json

时间:2013-05-21 18:17:43

标签: ruby-on-rails json api

我希望我的location_controller中的respond_to :json来自我的位置和啤酒模型。

我的位置控制器看起来像这样

class LocationsController < ApplicationController
respond_to :html, :json
  # GET /locations
  # GET /locations.json
  def index
    @locations = Location.all
     respond_with(@locations,:only => [:id,:lat,:long,:name,:street_address,:place,:route],:methods => [:main_url, :beer_name])
  end 

@beer belongs_to:location我想:啤酒模型的名称要添加到上面的位置响应中。这是我的beers_controller

class BeersController < ApplicationController
  respond_to :html, :json
  # GET /beers
  # GET /beers.json

  def index
    @beers = Beer.where(:location_id => params[:location_id])
    respond_with(@beers,:only => [:id,:name,:description,:price,:style,:location_id, :brewery, :available],:methods => [:label_url])      
  end

我该怎么做?感谢。

2 个答案:

答案 0 :(得分:0)

看看: https://github.com/nesquena/rabl

Rabl提供了一种简单的方法来检索对象上的所有关系,并且您可以以简洁明了的方式构建json。

由于您的啤酒模型属于某个地点,您有两种选择:

  • 如果位置has_one啤酒,您可以直接访问 location.beer.name,这个意思,来自啤酒的名字 位置。

  • 如果您定位has_many beer(s),则可以循环迭代 每个啤酒的位置:

代码:

location.beers.each do |beer| 
   puts beer.name
end

答案 1 :(得分:0)

rabl gem似乎是一个很好的方法,但我决定将其添加到我的位置模型

def as_json(options={})
    super(:only => [:id,:lat,:long,:name,:street_address,:place,:route], :methods => [:main_url],
          :include => {
            :beers => {:only => [:name]}
          }
    )
  end

这对我有用。