【问题标题】:How to respond to HTML requests made via AJAX in Rails如何在 Rails 中响应通过 AJAX 发出的 HTML 请求
【发布时间】:2009-09-30 15:02:44
【问题描述】:

我正在尝试编写一个 Rails 控制器方法,该方法将响应“正常”(例如,通过链接)和通过 ajax 发出的请求。

正常情况:控制器应使用布局以完全修饰的 HTML 响应。

Ajax 案例:控制器应使用模板生成的 HTML sn-p 响应(无布局)

这是我创建的 jQuery 代码,用于在客户端运行以执行获取请求。

jQuery.get("http://mydomain.com/some_controller/some_action", 
           {}, 
           function(data, textstatus) {
             jQuery("#target").html(data);
           },
           "html");

在 Rails 中处理这个问题的最佳方法是什么?

【问题讨论】:

    标签: jquery ruby-on-rails ajax


    【解决方案1】:

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

    例如:

    class SomeController < ApplicationController
      layout :get_layout
    
      protected
    
      def get_layout
        request.xhr? ? nil : 'normal_layout'
      end
    end
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 哦 - 我不知道 request.xhr?希望您不介意我编辑我的答案以使用它。
      • 在问题的上下文中,format.js 不是最好的选择,因为他想要 html 出来。为了让它工作,你的 js 模板应该生成 html,这是令人困惑的。
      【解决方案3】:

      另一种方法是在网址中注册新格式和specify it explicitly

      把这个放到config/initializers/mime_types.rb:

      Mime::Type.register_alias 'text/html', :xhtml
      

      将您的模板保存在some_controller/some_action.xhml.haml

      并将格式添加到 url: 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 mime 类型。

      这可能是 url 中显式格式的替代方法,虽然我还没有尝试过。

      【讨论】:

      • 这是一个很好的不显眼的解决方案。但是,我喜欢在控制器中简单地使用:respond_to :xhtml if request.xhr?,而不是修改 URL。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2013-03-16
        • 1970-01-01
        • 2011-04-14
        • 1970-01-01
        • 1970-01-01
        • 2011-10-02
        • 2017-08-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多