我在控制器中有这个:
respond_to do |format|
format.html
format.js { render :layout => false }
end
当请求是Ajax时,哪些输出没有布局。我在许多动作和控制器中复制它。我该如何干这个?
答案 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 %>