响应多个 JSON 渲染。 (红宝石/导轨)

Posted

技术标签:

【中文标题】响应多个 JSON 渲染。 (红宝石/导轨)【英文标题】:responding with multiple JSON renders. (Ruby/Rails) 【发布时间】:2011-08-09 11:45:46 【问题描述】:

这是一个相对简单的,我很确定它只是语法。

我试图将多个对象呈现为 json 作为控制器中的响应。所以是这样的:

  def info
    @allWebsites = Website.all
    @allPages = Page.all
    @allElementTypes = ElementType.all
    @allElementData = ElementData.all


    respond_to do |format|
      format.jsonrender :json => @allWebsites
      format.jsonrender :json =>@allPages  
      format.jsonrender :json =>@allElementTypes  
      format.jsonrender :json =>@allElementData
      end
    end
  end 

问题是我只得到一个 json 并且它总是最重要的。有没有办法以这种方式渲染多个对象?

或者我应该创建一个由其他 objects.to_json 组成的新对象?

【问题讨论】:

【参考方案1】:

你实际上可以这样做:

format.json 
   render :json => 
      :websites => @allWebsites,
      :pages => @allPages,
      :element_types => @AllElementTypes,
      :element_data => @AllElementData
   

如果您使用 jquery,您将需要执行以下操作:

data = $.parseJSON( xhr.responseText );
data.websites #=> @allWebsites data from your controller
data.pages #=> @allPages data from your controller

等等

编辑:

回答您的问题,您不必解析响应,这正是我通常所做的。有许多功能可以立即为您完成,例如:

$.getJSON('/info', function(data) 
  var websites = data.websites,
      pages = data.pages,
      ...

);

【讨论】:

关于 Jquery,我只是想澄清一下,您的意思是说,当从服务器接收到 json 时,我必须将其解析回单独的 json 元素? 对我来说就是这样。听起来很合理。 正确 - 响应必须是 one json 对象...然后您可以在收到响应后进一步分解它。这就是为什么 rails 只发送一个而忽略其他的 - 你只能发送一个! 我该怎么办:element => @element, :only => [:id, :property], :include => :assoc

以上是关于响应多个 JSON 渲染。 (红宝石/导轨)的主要内容,如果未能解决你的问题,请参考以下文章

在渲染之前重新安排对象上的 CakePHP JSON 响应

红宝石 紫外线、导轨、豹纹

如何从动态列表中为 Vue 中的 API 响应创建列表渲染 JSON?

如何根据列表中的数据在颤动中渲染多个小部件?

Rails:红宝石在导轨上的未知属性错误

Rails - 格式和渲染 - 它们是如何工作的?