Ruby on rails 从索引操作传递json并同时呈现另一个应用程序布局。RubyonRails

Ruby on rails 从索引操作传递json并同时呈现另一个应用程序布局。RubyonRails,ruby-on-rails,ruby-on-rails-3,json,angularjs,Ruby On Rails,Ruby On Rails 3,Json,Angularjs,我有一个空位控制器,我需要将@Spaces传递给json,并呈现另一个布局。下面的代码不起作用(虽然没有传递json,但我有“宽”布局)。如果我删除format.html{render layout:“wide”},json将正确传递。如何将这两件事结合起来 class VacanciesController < ApplicationController respond_to :html, :json ... def index @vacancies = Vacanc

我有一个空位控制器,我需要将@Spaces传递给json,并呈现另一个布局。下面的代码不起作用(虽然没有传递json,但我有“宽”布局)。如果我删除format.html{render layout:“wide”},json将正确传递。如何将这两件事结合起来

class VacanciesController < ApplicationController
respond_to :html, :json
...
    def index
      @vacancies = Vacancy.all
      respond_with(@vacancies) do |format|
       format.html { render layout: "wide"} }
       format.json { render json: @vacancies } 
      end
     end
  ...
类真空控制器
不能调用render两次,这是问题1。您也不能对一个请求发送两个响应

同时呈现HTML(这意味着新的页面加载)和发送JSON(用于AJAX请求,即不重新加载页面的请求)也是没有意义的。这是不可能的,但即使是可能的,也毫无意义

如果要告诉请求使用特定布局,可以将布局选项传递给渲染调用。但是,渲染调用不使用数据对象作为第一个参数,而是使用视图名称或仅使用选项哈希。因此,要正确调用此函数,应使用:

render :index, :layout => 'example'
我希望这将使您的HTML视图正确显示

但是,请理解,布局选项仅适用于HTML响应,而不适用于JSON响应。Layout告诉您的呈现调用要围绕您的操作调用的视图包装的外部HTML,如果您没有指定,它将使用“application.HTML”

为了帮助您理解另一件事:您的响应块告诉计算机如何响应不同类型的请求。它就像一个总机。如果使用If/else语句编写,它可能如下所示:

if request_type == 'html'
  render :index, :layout => 'wide'
elsif request_type == 'json'
  render :json => @vacancies
else
  raise raise ActionController::UnknownFormat
end
因此,如果使用respond_with block修复html呈现调用,并且假设您正在本地主机上开发,如果您在浏览器中输入以下URL并按enter键

http://localhost:3000/vacancies
这将产生一个HTML格式的GET请求,该请求将加载带有
layout:'wide'
但没有其他数据的页面。如果键入:

http://localhost:3000/vacancies.json
这将模拟一个JSON请求,您将只得到
@expansions
数据的JSON表示

我希望这能帮助你解决你的问题。如果没有,请更详细地描述您正在努力完成的任务,以便我可以帮助您了解如何完成

PS:最后一个提示:如果您想在控制器级别指定布局,您可以在控制器顶部调用
layout
,如下所示:

class ExampleController < ApplicationController
  layout 'awesome', :only => [:new,:edit]
  ...
end
class ExampleController[:新建,:编辑]
...
结束

这与任何其他过滤器一样工作,您可以传递:only、or:except或根本不传递任何选项。

您不能调用render两次,这就是问题1。您也不能对一个请求发送两个响应

同时呈现HTML(这意味着新的页面加载)和发送JSON(用于AJAX请求,即不重新加载页面的请求)也是没有意义的。这是不可能的,但即使是可能的,也毫无意义

如果要告诉请求使用特定布局,可以将布局选项传递给渲染调用。但是,渲染调用不使用数据对象作为第一个参数,而是使用视图名称或仅使用选项哈希。因此,要正确调用此函数,应使用:

render :index, :layout => 'example'
我希望这将使您的HTML视图正确显示

但是,请理解,布局选项仅适用于HTML响应,而不适用于JSON响应。Layout告诉您的呈现调用要围绕您的操作调用的视图包装的外部HTML,如果您没有指定,它将使用“application.HTML”

为了帮助您理解另一件事:您的响应块告诉计算机如何响应不同类型的请求。它就像一个总机。如果使用If/else语句编写,它可能如下所示:

if request_type == 'html'
  render :index, :layout => 'wide'
elsif request_type == 'json'
  render :json => @vacancies
else
  raise raise ActionController::UnknownFormat
end
因此,如果使用respond_with block修复html呈现调用,并且假设您正在本地主机上开发,如果您在浏览器中输入以下URL并按enter键

http://localhost:3000/vacancies
这将产生一个HTML格式的GET请求,该请求将加载带有
layout:'wide'
但没有其他数据的页面。如果键入:

http://localhost:3000/vacancies.json
这将模拟一个JSON请求,您将只得到
@expansions
数据的JSON表示

我希望这能帮助你解决你的问题。如果没有,请更详细地描述您正在努力完成的任务,以便我可以帮助您了解如何完成

PS:最后一个提示:如果您想在控制器级别指定布局,您可以在控制器顶部调用
layout
,如下所示:

class ExampleController < ApplicationController
  layout 'awesome', :only => [:new,:edit]
  ...
end
class ExampleController[:新建,:编辑]
...
结束
这与任何其他过滤器一样,您可以传递:only、or:except或根本不传递选项