必须调用“render:layout => false”才能在Rails 2.3.3中正确呈现js.erb模板

时间:2009-07-22 20:47:31

标签: ruby-on-rails ruby

我正在运行最新的Rails 2-3-stable分支(目前为2.3.3)。

我正在使用JQuery向我的'create'操作发布一个AJAX请求,其中我有以下块:

respond_to do |format|
  format.js
end

我已创建create.js.erb并测试此操作,我添加了以下单行:

alert('hello');

请求正确进入format.js块,但响应尝试呈现布局。这是我的日志:

Jul 22 20:44:27 [2970] INFO: Rendering template within layouts/application
Jul 22 20:44:27 [2970] INFO: Rendering contacts/create

如果我将respond_to块更改为以下内容,则可以:

respond_to do |format|
  format.js { render :layout => false }
end

这是预期的行为还是Rails中的错误?我原以为我渲染JS响应就足以将布局设置为false。

4 个答案:

答案 0 :(得分:10)

我用这个:

class ApplicationController < ActionController::Base
  # this is needed to prevent XHR request form using layouts
  before_filter proc { |controller| (controller.action_has_layout = false) if controller.request.xhr? }

它就像魅力一样。你必须将这个在线人员放在一个地方并注意更多。

我花了大约1小时来写这一行。

答案 1 :(得分:2)

我发现处理此问题的最佳方法是添加如下文件:

应用程序/视图/布局/ application.js.erb

<%= yield -%>

如果您不包含yield,那么您的js操作都将失败,因为应用程序将永远不会呈现视图。此技术解决了布局问题,并且还提供了在布局级别添加通用js代码的功能,例如闪存处理或触发jQuery UI onLoad挂钩。

答案 2 :(得分:1)

我对Rails书籍上的Ajax的记忆是,这是早期版本的rails中的标准,如果不一定是预期的行为。

以下故障单显示了几个版本的错误记录,以及将行为定义为默认值的方法。

http://dev.rubyonrails.org/ticket/3229

遗憾的是,最终评论中没有解释后来的变化是什么导致过时的说明。

答案 3 :(得分:0)

发出Ajax POST请求的JQuery函数应该返回“false”。检查你是否也这样做。它应该像下面这样实现:

postFormData: function () {
  $('#form_id').submit(function () {
    $.post($(this).attr('action'), $(this).serialize(), null, 'script');
    return false;
  });
}

注意返回false的最后一行。