rails 4.1.6 form_for coffeescript在多个视图上不起作用

rails 4.1.6 form_for coffeescript on multiple views not working

本文关键字:视图 不起作用 coffeescript for form rails      更新时间:2023-09-26

我可以用一个视图(/users/new.html.erb)显示我的coffeescript错误消息:

<h1> Sign up! </h1>
<%= form_for (@user) do |f| %>
  <%= f.label :email %><p class="error email-error"></p>
  <%= f.email_field :email %>       
  <%= f.submit "Sign Up", class: 'btn' %>   
<% end %>

和一个coffeescript文件(/users.js.coffee):

ready = ->
  $('form').submit ->
    $('.error').text ''    
    email = $('#user_email').val()
    if email == ''
      $('.email-error').text 'Please enter your email.'
    false
  return
$(document).ready(ready)
$(document).on('page:load', ready)

但是当我尝试添加第二个视图(/sessions/new.html.erb)时,两个表单的错误消息都不会显示:

<h1> Log In </h1>
<%= form_for(:session, url: login_path) do |f| %>
  <%= f.label :email %><p class="error email-error"></p>
  <%= f.email_field :email, :id => "session_email" %>
  <%= f.submit "Log In", class: 'btn' %>    
<% end %>

和coffeescript文件(/sessions/js.coffee):

main = ->
  $('form').submit ->
    $('.error').text ''    
    email = $('#session_email').val()
    if email == ''
      $('.email-error').text 'Please enter your email'
    false
  return
$(document).ready(main)
$(document).on('page:load', main)

我知道coffeescript最终是由rails编译成一个文件的,所以它不知道我引用的是哪个"表单"。但当我尝试在表单中添加id标签时,我甚至无法让一个表单工作。我在这件事上已经坚持了两天,一直想不通。如有任何帮助,我们将不胜感激。谢谢

在"mu太短"的帮助下,我能够在两个表单上都显示错误消息。问题是.submit()绑定到一个表单并阻止它绑定到第二个表单。添加.unbind()修复了这个问题:

ready = ->
  $('form.new_user').submit ->
    $('.error').text ''    
    email = $('#user_email').val()
    if email == ''
      $('.email-error').text 'Please enter your email.'
    $('form').unbind('submit')  
    false
  return
$(document).ready(ready)
$(document).on('page:load', ready)

与第二个咖啡脚本文件:

main = ->
  $('form.s_login').submit ->
    $('.error').text ''    
    s_email = $('#session_email').val()
    if s_email == ''
      $('.email-error').text 'Please enter your email'
    $('form').unbind('submit')  
    false
  return
$(document).ready(main)
$(document).on('page:load', main)