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 => 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的主要内容,如果未能解决你的问题,请参考以下文章
Rails3 使用 text/html 内容类型而不是 text/javascript 呈现 js.erb 模板
Rails js.erb 不呈现部分文件但得到呈现的响应文件