繁体   English   中英

如何响应在Rails中通过AJAX发出的HTML请求

[英]How to respond to HTML requests made via AJAX in Rails

我正在尝试编写一个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中处理这个问题的最佳方法是什么?

在您的控制器中动态选择是否使用基于request.xhr?的布局request.xhr?

例如:

class SomeController < ApplicationController
  layout :get_layout

  protected

  def get_layout
    request.xhr? ? nil : 'normal_layout'
  end
end

在您的控制器方法中,只需执行此操作:

   respond_to do |format|
      format.js if request.xhr?
      format.html { redirect_to :action => "index"}
    end

另一种方法是注册新格式并在URL中明确指定

把它放在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.xhtmlhttp://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 :用于覆盖XHR mime类型的mime类型。

这可能是网址中显式格式的替代方法,但我还没有尝试过。

如果您使用的是新版本的rails,您只需将.js附加到路径上,它就会推断该请求是一个JavaScript调用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM