当格式为JS(需要烘干)时渲染无布局

时间:2011-04-20 11:28:59

标签: javascript ruby-on-rails ruby-on-rails-3 dry xmlhttprequest

我在控制器中有这个:

respond_to do |format|
  format.html
  format.js { render :layout => false }
end

当请求是Ajax时,哪些输出没有布局。我在许多动作和控制器中复制它。我该如何干这个?

5 个答案:

答案 0 :(得分:17)

我在我的应用程序控制器中使用它:

class ApplicationController < ActionController::Base
  layout proc{|c| c.request.xhr? ? false : "application" }
end

其中包括.js,.json等等。

答案 1 :(得分:6)

嗯,这个答案已经晚了几年,但您也可以通过将其重命名为apps/views/layouts/application.html.erb来创建布局作为特定于HTML的布局。

如果mime-type不匹配,Rails足够聪明,不会使用js响应的布局。

最近版本的rails很可能会为你解决这个问题,但从3.0.20开始,这对我有用。

答案 2 :(得分:1)

尝试新的respond_with语法:

class SomeController < ApplicationController
  respond_to :html, :json

  ...

  def index
    @things = Something.all
    respond_with(@things)
  end

  ...
end

虽然它看起来像是在没有布局的情况下进行渲染,但你几乎回到what you had before,但至少你已经在大部分行动中消除了样板。如果您正在寻找respond_with的详细说明,请查看Jose Valim的“Crafting Rails Applications”。好书!

答案 3 :(得分:1)

对于非常简单的DRYing,您可以随时将respond_to块放在子例程中:

class SomeController < ApplicationController

  ...

  def index
    @things = Something.all
    respond
  end

  def new
    @new_thing = Something.new
    respond
  end

  ...

private
  def respond
    respond_to do |format|
      format.html
      format.js { render :layout => false }
    end
  end
end

答案 4 :(得分:1)

另一种选择是使用:

创建samename.js.erb的布局文件
<%= yield %>