2009-07-22 83 views
3

我正在运行最新的Rails 2-3稳定分支(当前为2.3.3)。必须调用“render:layout => false”才能在Rails 2.3.3中正确呈现js.erb模板。

我使用jQuery发布一个AJAX请求我的“创造”的行动,其中我有以下块:

我创建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。

回答

1

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

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

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

可悲的是什么样的后来变化是使这种过时未在最后的评论解释说明。

0

生成Ajax POST请求的JQuery函数应该返回“false”。检查你是否也这样做。它应该执行如下:

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

注意最后一行返回false。

+0

是的,我已经返回false了 – Olly 2009-07-27 11:49:50

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小时写这行。

2

我发现处理这种情况最好的方法是添加一个像这样的文件:

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

<%= yield -%> 

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

相关问题