Rails Ajax:.js.erb呈现为文本,而不是JS

时间:2011-03-15 11:48:09

标签: jquery ruby-on-rails ajax

我在使用rails3来渲染Javascript时遇到了麻烦(如果这是相关的,我使用JQuery并且它可以很好地工作,因为它在应用程序的许多其他部分中使用)而不是html。

我拥有的: 我认为,我有这个链接:

<%= link_to 'Edit', edit_user_repreneur_path(@user_repreneur, :format => :js), :remote => true %>

首先,我真的不知道为什么要添加:format =&gt; :js让控制器使用JS视图,而不是HTML视图。 这是控制器的代码:

def edit
    @user_repreneur = UserRepreneur.find_by_id_view(params[:id])
    respond_to do |format|
      format.js
      format.html
    end 
end

在控制器类的开头,我有这一行:

  respond_to :js, :html

我的edit.js.erb文件包含一行警告。 但是,在呈现页面时,JS将呈现为文本,因此不会执行。 我试图将format.js行更改为

format.js { render :layout => false }

但它没有改变任何东西。 我想我错过了一些东西,但我真的不知道是什么......

非常感谢,欢呼!

PS:我不知道这是否有用,但在我添加之前:format =&gt; :js位在我的链接助手中,视图总是呈现为HTML,如果我注释了format.html行,我在服务器端出现了406 Not Acceptable错误。

4 个答案:

答案 0 :(得分:13)

我认为问题不在于您的服务器端代码。这对我来说都很好看。它呈现edit.js.erb这一事实证明您的服务器端代码工作正常。

问题出在您的客户端。当它收到Ajax响应时,它不会以javascript的形式执行它。它正在以文本形式执行它。

我最近自己遇到过这个问题,我希望我的代码可以随身携带,但我正在工作。但是,我个人编写了jQuery Ajax请求而不是依赖:remote => true,因为该选项主要用于表单。

尝试为您的link_to提供一个ID,然后将此jQuery放在application.js或任何地方。

$('#link_id').click(function(){
   $.ajax({
      type : 'GET',
      url : '/:controller/:action/',
      dataType : 'script'
   });
   return false;
});

这将获取链接的click事件,向服务器发送请求,该请求应返回edit.js.erb文件,然后以脚本形式执行。

请注意,需要考虑许多安全问题以及真实性令牌等。但是,这应该让您的警报执行并让您走上完成应用程序的正确道路。

阅读jQuery's Ajax以获取有关POST数据的更多选项和详细信息。

希望这会有所帮助。

更新:其他可能的解决方案包括使用UJS作为Javascript驱动程序。您可以阅读https://github.com/rails/jquery-ujs上的文档,并使用UJS查看有关Unobtrusive Javascript主题的Railscast。

答案 1 :(得分:1)

提供这个答案似乎有点晚了,但从来没有好过。

你正在混合respond_to和respond_with。在控制器类的顶部使用respond_to:js,:html。然后将其放入您的编辑操作

def edit
  @user_repreneur = UserRepreneur.find_by_id_view(params[:id])
  respond_with @user _repreneur
end 

答案 2 :(得分:1)

如果你没有在application.js文件中包含jquery_ujs lib,那么

js.erb文件将呈现为文本:

//= require jquery
//= require jquery_ujs

你的gemfile中需要以下宝石:

gem 'jquery-rails'
gem 'jquery-ui-rails'

答案 3 :(得分:0)

如果你在轨道上,

简单修复:添加数据类型=&#34;脚本&#34;到形式。 资料来源:https://github.com/rails/jquery-ujs/wiki/Unobtrusive-scripting-support-for-jQuery