Проверка формы JavaScript в Ruby on Rails - у меня работает JS, но куда мне его поместить?

0

Я создал калькулятор недвижимости в Ruby для моего финального проекта в классе выпускников. Проект должен состояться примерно через 24 часа (в понедельник), поэтому я очень ценю помощь.

Приложение работает отлично, но мне нужно добавить проверку на стороне клиента с помощью JS. Я получил JS для работы так же, как я хочу, в базовой форме html, но теперь мне нужно применить эту функциональность JS к форме, которую наша группа использовала в среде Ruby on Rails.

Я не уверен, как точно слить эти две формы и где разместить JS так, чтобы функции init не перезаписывали друг друга или не вызывали ошибку. Я бы предположил, что все JS-коды находятся в папке App/assets/javascript, но я немного смущен тем, как JS правильно ссылается на каждую форму, которую я создаю, потому что я должен сделать это для трех форм, потому что у меня есть три субъекты: субъект инвестора, субъект недвижимости и объект ипотеки.

Я получил всю проверку JS, работающую локально для каждого из этих трех объектов, и я вставил одну для ипотеки ниже. Они каждый в своих отдельных папках, когда я создал и тестировал проверки JS локально, но на ruby git repo, я думаю, что все JS-коды имеют одну и ту же папку JS таким образом, что... ну я не знаю о JS в RoR еще, но я предполагаю, что все JS в этой папке assets/js активны.

Я волнуюсь, потому что, если я выброшу весь код проверки JS в этой папке или объединил его в один файл, тогда возникнет конфликт, если все три объекта вызовут функцию с тем же именем ("initPage")?

Итак... хммм.. Я думаю, если бы я просто переименовал эту initPage() в 3 отдельные функции, например:

  • initInvestorPage()
  • initMortgagePage()
  • initPropertyPage()
ВОПРОСОВ: будет ли это правильным способом, или как еще он узнает, для какой initPage() для вызова? как традиционная форма html и форма Ruby form_for сливаются изящно?

Я вставил ниже всех JS-кода, необходимых для работы, но на самом деле только определения предупреждений и одна функция initPage() различаются для каждого объекта. Я бы предположил, что utils.js можно просто поместить в папку assets/js, но как насчет другого JS-кода для трех объектов?

Я (?):

  • вариант 1) объединить все это в один файл custom.js и переименовать initPage в три отдельные функции. ИЛИ
  • вариант 2) сохранить js файлы отдельно и как-то вызвать их отдельно в зависимости от формы
  • вариант 3) пойти другим путем с ним...
  • вариант 4) провести долгий путь от короткого пирса за день до последней недели

Спасибо!!

Ипотечная форма в Ruby, что мне нужно добавить JS валидацию: (извините за все разметки, что при использовании Bootstrap)

<% provide(:title, 'Create mortgage') %>
<div class="container">
  <div class="page-header">
    <h1>Create mortgage</h1>
  </div>
  <div class="row"> 
    <%= render 'layouts/sidebar' %> 
    <div class="col-md-9">
      <%= form_for(@mortgage) do |f| %>
      <%= render 'shared/error_messages', object: f.object %>
        <div class="col-md-12">
          <div class="col-md-6">
            <fieldset class="property_create_group">    
              <label for="mortgage_name">Mortgage name</label>
              <%= f.text_field :name, :class => "form-control" %>
            </fieldset>
          </div>           
          <div class="col-md-2 clear-both1">
            <fieldset class="property_create_group">    
              <label for="mortgage_amount">Amount</label>
              <%= f.number_field :amount, :class => "form-control" %>          
            </fieldset>
          </div>  
          <div class="col-md-2">
            <fieldset class="property_create_group">    
              <label for="mortgage_terms">Term (yr)</label>
              <%= f.number_field :terms, :class => "form-control" %>      
            </fieldset>
          </div>   
          <div class="col-md-2">
            <fieldset class="property_create_group">         
              <label for="mortgage_interestRate">Interest</label>
              <%= f.number_field :interestRate, :class => "form-control" %>            
            </fieldset>
          </div>          
        </div>
          <div class="col-md-4 col-md-offset-1">
            <%= f.submit "Create mortgage", class: "btn btn-large btn-success" %>
          </div>         
      <% end %>
    </div><!-- /col-md-9-->
  </div><!-- /row-->
</div><!-- /container-->

Mortgage.html:

<head>
 <link rel="stylesheet" type="text/css" href="css/forms.css" />
 <script src="scripts/utils.js" type="text/javascript"></script>
 <script src="scripts/mortgage.js" type="text/javascript"></script> 
</head>
<body>
  <div id="content">
   <form action="#" method="post">
    <fieldset><label for="mname">Mortgage name</label>
     <input name="mname" id="mname" type="text" /></fieldset>
    <fieldset><label for="amount">Amount</label>
     <input name="amount" id="amount" type="text" /></fieldset>
    <fieldset><label for="terms">Terms</label>
     <input name="terms" id="terms" type="text" /></fieldset>
    <fieldset><label for="interestRate">Interest Rate</label>
     <input name="interestRate" id="interestRate" type="text" /></fieldset>
     <input type="submit" id="createMortgage" value="Create Mortgage" disabled="disabled"  />
    </fieldset>
   </form>
  </div>
</body>
</html>

Mortgage.js:

window.onload = initPage;

var warnings = {
  "mname" : {
    "required": "Please enter a name for your mortgage.",
    "err"     : 0
  },
  "amount" : {
    "required": "Please enter the amount of the mortgage.",
    "numbers" : "Only numbers are allowed in the mortgage amount.",
    "err"     : 0
  },
  "terms" : {
    "required": "Please enter the terms (in years) of the mortgage. ",
    "numbers" : "Only numbers (in years) can be given for the mortgage terms.",
    "err"     : 0
  },
  "interestRate" : {
    "required": "Please enter the amount of the interest rate.",
    "numbers" : "Only numbers are allowed in the interest rate.",
    "err"     : 0
  }
}

function initPage() {
  addEventHandler(document.getElementById("mname"), "blur", fieldIsFilled);
  addEventHandler(document.getElementById("amount"), "blur", fieldIsFilled);
  addEventHandler(document.getElementById("amount"), "blur", fieldIsNumbers);
  addEventHandler(document.getElementById("terms"), "blur", fieldIsFilled);
  addEventHandler(document.getElementById("terms"), "blur", fieldIsNumbers);
  addEventHandler(document.getElementById("interestRate"), "blur", fieldIsFilled);
  addEventHandler(document.getElementById("interestRate"), "blur", fieldIsNumbers);
}

function fieldIsFilled(e) {
  var me = getActivatedObject(e);
  if (me.value == "") {
    warn(me, "required");
  } else {
    unwarn(me, "required");
  }
}

function fieldIsLetters(e) {
  var me = getActivatedObject(e);
  var nonAlphaChars = /[^a-zA-Z]/;
  if (nonAlphaChars.test(me.value)) {
    warn(me, "letters");
  } else {
    unwarn(me, "letters");
  }
}

function fieldIsNumbers(e) {
  var me = getActivatedObject(e);
  var nonNumericChars = /[^0-9]/;
  if (nonNumericChars.test(me.value)) {
    warn(me, "numbers");
  } else {
    unwarn(me, "numbers");
  }
}

function warn(field, warningType) {
  var parentNode = field.parentNode;
  var warning = eval('warnings.' + field.id + '.' + warningType);
  if (parentNode.getElementsByTagName('p').length == 0) {
    var p = document.createElement('p');
    field.parentNode.appendChild(p);
    var warningNode = document.createTextNode(warning);
    p.appendChild(warningNode);
  } else {
    var p = parentNode.getElementsByTagName('p')[0];
    p.childNodes[0].nodeValue = warning;
  }
  document.getElementById("createMortgage").disabled = true;
}

function unwarn(field, warningType) {
  if (field.parentNode.getElementsByTagName("p").length > 0) {
    var p = field.parentNode.getElementsByTagName("p")[0];
    var currentWarning = p.childNodes[0].nodeValue;
    var warning = eval('warnings.' + field.id + '.' + warningType);
    if (currentWarning == warning) {
      field.parentNode.removeChild(p);
    }
  }
  var fieldsets = 
    document.getElementById("content").getElementsByTagName("fieldset");
  for (var i=0; i<fieldsets.length; i++) {
    var fieldWarnings = fieldsets[i].getElementsByTagName("p").length;
    if (fieldWarnings > 0) {
      document.getElementById("createMortgage").disabled = true;
      return;
    }       
  }
  document.getElementById("createMortgage").disabled = false;
}

Utils.js:

function createRequest() {
  try {
    request = new XMLHttpRequest();
  } catch (tryMS) {
    try {
      request = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (otherMS) {
      try {
        request = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (failed) {
        request = null;
      }
    }
  } 
  return request;
}


function getActivatedObject(e) {
  var obj;
  if (!e) {
    // early version of IE
    obj = window.event.srcElement;
  } else if (e.srcElement) {
    // IE 7 or later
    obj = e.srcElement;
  } else {
    // DOM Level 2 browser
    obj = e.target;
  }
  return obj;
}

function addEventHandler(obj, eventName, handler) {
  if (document.attachEvent) {
    obj.attachEvent("on" + eventName, handler);
  } else if (document.addEventListener) {
    obj.addEventListener(eventName, handler, false);
  }
}
  • 0
    Мне было лень читать весь ваш код, но позвольте мне посоветовать вам использовать jQuery, чтобы вы могли удалить все это дерьмо.
Теги:
validation

1 ответ

0

Вы можете попробовать получить lok в gent_side_validation. Он больше не поддерживается, но он должен облегчить вашу жизнь без написания каких-либо дополнительных js. https://github.com/bcardarella/client_side_validations

Ещё вопросы

Сообщество Overcoder
Наверх
Меню