当我通过 "link_to" link 访问我的页面时,为什么我的咖啡脚本函数没有定义?

Why isn't my coffee script function defined when I visit my page via a "link_to" link?

我正在使用 Rails 4.2.7。在特定页面 (/users/edit) 上,我有这个 link

<%= link_to "Cancel", {:controller => :my_objects, :action => 'index' }, :class => 'btn' %>

当我点击 link 时,我被带到了正确的页面,其中我有一个应该执行的咖啡脚本。它包含这个

$ ->
  #("#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');

奇怪的是,当我点击上面我的link时,页面出现JS错误

my_objects.self-50d1edb….js?body=1:16 Uncaught TypeError: setup_save_behavior is not a function

即使 console.log 已执行(我可以看到“正在调用函数加载。”打印出来)。如果我真的进入 URL 的地址栏,然后键入我的 URL、“http://loclahost:3000/my_objects/index”,那么一切都会正常加载并且没有 Javascript 错误。我完全不知所措。当我单击“link_to”脚本定义的 link 时,我该怎么做才能定义我的函数?

Turbolinks 可能会导致您的 Rails 应用程序出现问题,因为它试图通过维护页面的 <head> 元素中列出的资产(以及其他内容)来节省开销。当您使用完全加载(通过刷新按钮)加载页面时,实际的 ready 事件发生并且您的脚本工作。另一方面,如果您以其他方式访问页面(通过 link),Turbolinks 会尝试重用 <head> 元素,因此没有 ready事件被触发。

过去的解决方案是完全禁用 Turbolinks,方法是删除 application.js 中的 require 行或 link(data: {no_turbolink: true}).使用 Rails 4.2.x 和 5.x,您可以侦听 Turbolinks 相关事件,该事件应该在正常 ready 事件之前起作用的地方起作用.

来自documentation:

However, because Turbolinks overrides the normal page loading process, the event that this relies on will not be fired. If you have code that looks like this

$(document).ready ->
  alert "page has loaded!"

you must change your code to do this instead:

$(document).on "turbolinks:load", ->
  alert "page has loaded!"

(为清晰起见略微重新排列了引文)