我正在尝试编写一个Rails控制器方法,该方法将响应“正常”(例如,通过链接)和通过ajax获取请求。
正常情况:控制器应使用布局响应完全装饰的HTML。
Ajax案例:控制者应该使用模板生成的HTML片段进行响应(无布局)
这是jQuery代码,我创建了在客户端运行以执行get请求。
jQuery.get("http://mydomain.com/some_controller/some_action",
{},
function(data, textstatus) {
jQuery("#target").html(data);
},
"html");
在Rails中处理这个问题的最佳方法是什么?
答案 0 :(得分:13)
在控制器中动态选择是否使用基于request.xhr?
的布局。
例如:
class SomeController < ApplicationController
layout :get_layout
protected
def get_layout
request.xhr? ? nil : 'normal_layout'
end
end
答案 1 :(得分:9)
在您的控制器方法中,只需执行以下操作:
respond_to do |format|
format.js if request.xhr?
format.html { redirect_to :action => "index"}
end
答案 2 :(得分:3)
另一种方法是在网址中注册新格式和specify it explicitly。
将其放入config/initializers/mime_types.rb
:
Mime::Type.register_alias 'text/html', :xhtml
将模板保存在some_controller/some_action.xhml.haml
。
并将格式添加到网址:
http://mydomain.com/some_controller/some_action.xhtml
,或者更好,使用
url_for(:controller => :some_controller, :action => :some_action, :format => :xhtml)
或更好的路径助手(如果你足够安静):
some_controller_some_action_imaginary_path(:format => :xhtml)
请注意,此操作无需明确respond_to
调度。
如果你想要的只是为同一个模板切换布局,这种技术可能是一种矫枉过正,但如果普通和ajax版本不同,那么这肯定是一种方法。
修改强>
刚刚发布的jQuery 1.5.1提供了在$.ajax()
中指定mime类型的选项:
mimeType :用于覆盖的mime类型 XHR哑剧类型。
这可能是网址中显式格式的替代方法,但我还没有尝试过。
答案 3 :(得分:0)
如果你使用的是新版本的rails,你可以将.js附加到路径上,它会推断该请求是一个JavaScript调用