Rails Ajax: .js.erb文件被呈现为文本而非JS

6

我遇到了一个问题,无法在rails3中呈现Javascript(如果这是相关的话,我使用JQuery,在应用程序的许多其他部分中也可以正常使用),而不是html。

我有:

在视图中,我有这个链接:

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

首先,我不太明白为什么我需要添加: format =>: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 => :js之前,视图总是以HTML格式呈现,如果我注释掉format.html行,则服务器端会出现406不可接受的错误。


这真的是通过ajax请求发送的吗?您可以在控制台或Firebug控制台中进行检查。 - Michael Koper
在控制器开头使用 respond_to :js, :html 表示您预计在操作中使用 respond_with(而不是 respond_to)。我想知道这种冗余是否会引起问题 - 您是否尝试过在控制器中删除该第一行?另外,您不需要在视图中添加 :format => :js。 - Will Ayd
在Chrome控制台中,当我点击链接时,我看到一个GET请求,带有304响应代码和text/javascript类型。 此外,在控制器中注释该行不会改变任何内容,但还是谢谢您的信息 :)! 我知道我不应该需要在视图中指定格式,但否则它总是呈现HTML...奇怪。 - Elhu
它已经加载了,但在jquery.js之前,因此无法正常工作。非常感谢! - Elhu
嗨?我在哪里可以找到加载rails.js的地方?正确的位置在哪里呢? - namesake22
4个回答

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;
});

这会获取链接的点击事件,向服务器发送请求,服务器应该返回你的edit.js.erb文件,然后将其作为脚本执行。

请注意,还有很多安全问题需要考虑,例如身份验证令牌等。但是,这应该可以使你的警报执行并使你走上完成应用程序的正确道路。

阅读jQuery Ajax以了解更多选项和有关POST数据的详细信息。

希望对你有所帮助。

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


这个有效,非常感谢。 但是,我真的不明白为什么我必须使用这样的技巧... 以及为什么在链接上 :remote => true 似乎无法正常工作。 - Elhu
我自己也一直在思考这个问题。就像我说的,我更喜欢手写所有的Javascript代码,但我已经找到了一些更多的资源,肯定会帮助你,并相应地更新了我的答案。 - Charles Caldwell
你应该看一下 tommasop 在我的问题评论中提出的问题。这似乎是一个不值一提的检查,但它解决了我的问题。 - Elhu
1
笑死我了!真是不可思议,一个微小的问题竟然会引发如此连锁反应的沮丧。 - Charles Caldwell

1

如果在你的application.js文件中没有包含jquery_ujs库,那么js.erb文件将呈现为文本:

//= require jquery
//= require jquery_ujs

你需要在Gemfile中添加以下gem:

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

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 

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接