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

Posted

技术标签:

【中文标题】Rails Ajax:.js.erb 呈现为文本,而不是 JS【英文标题】:Rails Ajax: .js.erb rendered as text, not JS 【发布时间】:2011-07-15 17:42:48 【问题描述】:

我在使用 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 Not Acceptable 错误。

【问题讨论】:

真的是通过ajax请求发送的吗?您可以在控制台或萤火虫控制台中检查 在控制器的开头有 respond_to :js, :html 意味着你期望在你的操作中使用 respond_with(而不是 respond_to)。我想知道这种冗余是否会导致问题 - 您是否尝试过擦除控制器中的第一行?您也不需要将 :format => :js 添加到视图中 在 chrome 控制台中,当我单击链接时,我看到一个 GET 请求,其中包含 304 响应代码和 text/javascript 类型。此外,评论控制器中的行不会改变任何东西,但感谢您提供的信息:)!我知道我不需要在视图中指定格式,否则它总是呈现 HTML ......奇怪。 它已加载,但在 jquery.js 之前,因此无法正常工作。非常感谢! 嗨?我在哪里可以找到加载 rails.js 的地方?哪里是这样做的正确地方? 【参考方案1】:

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

问题出在您的客户端。当它接收到 Ajax 响应时,它不会将其作为 javascript 执行。它正在将其作为文本执行。

我自己最近遇到了这个问题,我希望我能随身携带我的代码,但我正在工作。但是,我个人编写了 jQuery Ajax 请求,而不是依赖 :remote =&gt; 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's Ajax 了解更多选项以及有关 POST 数据的详细信息。

希望这会有所帮助。

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

【讨论】:

这行得通,非常感谢。但是,我真的不明白为什么我必须使用这样的技巧......以及为什么 :remote => true 在链接上似乎无法正常工作。 我自己一直在思考这个问题。就像我说的那样,我更喜欢手工编写我的所有 Javascript,但我发现了更多资源,这些资源肯定会对你有所帮助,并相应地更新了我的答案。 你应该看看tommasop提出的问题,在我的问题的cmets中。检查似乎很愚蠢,但它解决了我的问题。 大声笑,这么小的事情怎么会导致如此级联的挫败感。【参考方案2】:

提供这个答案似乎有点晚了,但迟到总比不晚。

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

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

【讨论】:

【参考方案3】:

如果您的 application.js 文件中没有 jquery_ujs 库,js.erb 文件将呈现为文本:

//= require jquery
//= require jquery_ujs

您的 gemfile 中需要以下 gem:

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

【讨论】:

【参考方案4】:

如果你在轨道上,

简单修复:将 data-type="script" 添加到表单中。 来源:https://github.com/rails/jquery-ujs/wiki/Unobtrusive-scripting-support-for-jQuery

【讨论】:

以上是关于Rails Ajax:.js.erb 呈现为文本,而不是 JS的主要内容,如果未能解决你的问题,请参考以下文章

Rails - 如何确保已在 js.erb 中呈现部分内容

Rails3 使用 text/html 内容类型而不是 text/javascript 呈现 js.erb 模板

Rails '.js.erb' 不呈现部分

Rails js.erb 不呈现部分文件但得到呈现的响应文件

Ruby on Rails,json vs js ajax 响应

Rails:从另一个控制器渲染 .js.erb?