我正在使用 Rails 4.2.7 。在特定页面(/ users / edit)上,我有这个链接
<%= link_to "Cancel", {:controller => :my_objects, :action => 'index' }, :class => 'btn' %>
当我点击链接时,我被带到了正确的页面,其中我有一个应该执行的咖啡脚本。它包含这个
$ ->
#("#add_form).click ->
console.log(" invoking function load. ")
setup_save_behavior()
…
setup_save_behavior = () ->
$("a.modal_button").unbind('click')
$("a.modal_button").click ->
# Setup action
$('#new_my_object').attr('action', '/my_objects/create')
$('#_method').val('')
# Clear existing error messages
clear_form_errors()
# Clear existing form elements
$(':input[name^=my_object]','#new_my_object')
.not(':button, :submit, :reset')
.val('')
.removeAttr('checked')
.removeAttr('selected');
奇怪的是,当我点击上面的链接时,我在页面上得到了JS错误
my_objects.self-50d1edb….js?body=1:16 Uncaught TypeError: setup_save_behavior is not a function
即使执行了console.log(我可以看到“调用函数加载。”打印出来)。如果我实际进入我的网址的地址栏,然后输入我的网址“http://loclahost:3000/my_objects/index”,那么一切正常,并且没有Javascript错误。我完全不知所措。当我点击“link_to”脚本定义的链接时,我能做什么才能定义我的函数?
答案 0 :(得分:0)
Turbolinks可能会导致Rails应用程序出现问题,因为它会尝试通过维护页面<head>
元素中列出的资源(以及其他内容)来节省开销。使用完全加载(通过刷新按钮)加载页面时,会发生实际的ready
事件,并且您的脚本可以正常工作。另一方面,如果您以其他方式(通过链接)访问页面,Turbolinks会尝试重用<head>
元素,因此没有触发ready
事件。
过去的解决方案是通过删除require
中的application.js
行或链接(data: {no_turbolink: true}
)来完全禁用Turbolinks。使用Rails 4.2.x和5.x,您可以收听Turbolinks相关事件,该事件应该适用于之前正常ready
事件。{/ p>
但是,由于Turbolinks会覆盖正常的页面加载过程, 这种依赖的事件不会被解雇。如果你有代码 看起来像这样
$(document).ready ->
alert "page has loaded!"
您必须更改代码才能执行此操作:
$(document).on "turbolinks:load", ->
alert "page has loaded!"
(为清晰起见,引用稍微重新排列)