【问题标题】:Coffeescript not executing on Ruby on RailsCoffeescript 没有在 Ruby on Rails 上执行
【发布时间】:2015-09-24 05:04:33
【问题描述】:

我正在尝试使用 Coffeescript 在我的 Ruby on Rails 应用程序中进行一些表单验证。但是脚本没有执行。我正在尝试添加验证以检查输入的密码和输入的确认密码是否相等。

$(document).on 'ready page:load', ->
  password = document.getElementById('user_password').value
  password_confirmation = document.getElementById('user_password_confirmation').value

  validatePassword = ->
    password = document.getElementById('user_password').value
    password_confirmation = document.getElementById('user_password_confirmation').value
    if password.value != password_confirmation.value
      password_confirmation.setCustomValidity 'Passwords Don\'t Match'
    else
      password_confirmation.setCustomValidity ''
    return

  password.onchange = validatePassword
  password_confirmation.onkeyup = validatePassword

我添加了$(document).on 'ready page:load' this post 中提到的,但它似乎没有任何效果。

我对应的 .html.erb 文件包含以下代码:

<%= f.password_field :password,:onkeyup => 'validatePassword()', class: 'form-control',:required=>true %>
<%= f.password_field :password_confirmation, :onkeyup => 'validatePassword()', class: 'form-control',:required=>true %>

【问题讨论】:

  • 您确定此 coffescript 文件包含在您的资产管道中吗?它是否包含在页面源中?您在浏览器的控制台中是否遇到任何错误?
  • @bigsolom 是的,它在我的资产文件夹中。一旦页面加载,JavaScript 文件也会出现。控制台没有错误

标签: javascript ruby-on-rails ruby coffeescript


【解决方案1】:

您确定脚本没有运行吗?您是否将console.log 放入您的$(document).on 'ready page:load' 回调并检查它?

接下来...我相信即使执行脚本也不会起作用。在page:load 回调中定义validatePassword 函数时,您不会将其分配给窗口对象。这里发生的只是在外部无法访问的回调中创建本地函数(validatePassword() 在您的erb 文件中)。你应该写window.validatePassword = ...definition...

还有一件事。这行password = document.getElementById('user_password').value 返回一个值,即String。几行之后你正在写password.onchange = validatePassword,但问题是password 没有onchange 属性(因为它是一个字符串)。你可能想在这里实现的是password = document.getElementById('user_password')

【讨论】:

  • 我更正了 getElementById 中的值部分。我检查了 chrome 调试器,它遵循预期的路径。但是 setCustomvalidity 中设置的消息没有执行..我认为它与您提到的窗口有关。但是我无法关注它