【问题标题】:Don't render layout when calling from Ajax从 Ajax 调用时不呈现布局
【发布时间】:2014-08-28 16:59:53
【问题描述】:

我有一个名为 index 的 rails 操作,它可以将我的页面内容与布局一起呈现。当我使用浏览器执行 /index 操作时,它会按预期工作。我还希望能够通过使用 Ajax 调用它来呈现这个动作,我正在使用以下内容:

<%= link_to "Back", orders_path, :id => 'back_btn', :remote => true %>
<%= javascript_tag do %>
  jQuery("#back_btn").bind("ajax:complete", function(et, e){
    jQuery("#mybox").html(e.responseText);
  });
<% end %>

当以这种方式调用操作时,我希望它能够渲染并返回索引操作,不包括布局。我该怎么做?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    您应该能够像这样向控制器操作添加 format.js 操作:

    respond_to do |format|
      format.js
      format.html 
      format.json { render json: @foos }
    

    理想情况下,您应该创建一个 index.js.erb 文件来构建页面内容:

    $('#foos_list').update("<%= escape_javascript(render(@foos)) %>");
    

    如果您要更新 div 的内容,基本上更新布局内的整个页面,那么您会想要稍微改变它。在 format.js 中,您可以这样做:

    format.js { render 'foos/index', :layout => false }
    

    但是,如果您尝试使用 ajaxified 前端,我是否可以推荐一个框架来执行此操作,例如 Spine?它将在帮助您构建网站方面大有帮助。

    此外,使用这样的框架将迫使您按照@Zepplock 的第二条建议分离您的应用程序。

    【讨论】:

      【解决方案2】:

      你可以只检测请求是否是一个 XML HTTP 请求,然后像这样呈现一个空白布局:

      render layout: 'blank' if request.xhr?
      

      您需要在app/views/layouts/blank.html.erb 中创建一个空白布局,如下所示:

      <%= yield %>
      

      【讨论】:

        【解决方案3】:

        您需要一种方法让服务器知道请求类型存在差异。它可以通过几种不同的方式完成:

        • 将键值附加到 URL(例如 layout=off)并更改控制器逻辑以呈现不带视图的数据。这是一种黑客行为。
        • 让您的控制器通过 XML 或 JSON 返回数据(控制器将知道所请求的内容类型),然后对其进行相应的格式化并显示在浏览器中。这是更可取的方式,因为您可以明确区分内容类型,并且更适合 MVC 架构。
        • 创建一个提供数据的 API。这将导致单独的身份验证逻辑、客户端上的更多代码、服务器上的额外 APi 控制器等。很可能对您的情况来说是过度杀伤

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-01-23
          • 2014-09-07
          • 2017-05-02
          • 2016-11-16
          • 2012-12-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多