从Ajax调用时不要渲染布局

时间:2011-10-10 17:39:15

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

我有一个名为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 %>

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

3 个答案:

答案 0 :(得分:4)

您应该可以将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的第二个建议分离您的应用程序。

答案 1 :(得分:1)

您可以检测请求是否是XML HTTP请求,然后呈现如下的空白布局:

render layout: 'blank' if request.xhr?

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

<%= yield %>

答案 2 :(得分:0)

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

  • 将一个键值附加到URL(例如layout = off)并更改控制器逻辑以呈现没有视图的数据。这有点像黑客。
  • 让您的控制器通过XML或JSON返回数据(控制器将知道正在请求的内容类型),然后相应地格式化并存在于浏览器中。这是更优选的方式,因为您在内容类型之间有明确的分离,并且更适合MVC架构。
  • 创建一个提供数据的API。这将导致单独的身份验证逻辑,客户端上的更多代码,服务器上的其他APi控制器等。很可能对您的案例来说太过分了