Я создал калькулятор недвижимости в 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 отдельные функции, например:
Я вставил ниже всех JS-кода, необходимых для работы, но на самом деле только определения предупреждений и одна функция initPage() различаются для каждого объекта. Я бы предположил, что utils.js можно просто поместить в папку assets/js, но как насчет другого JS-кода для трех объектов?
Я (?):
Спасибо!!
Ипотечная форма в 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);
}
}
Вы можете попробовать получить lok в gent_side_validation. Он больше не поддерживается, но он должен облегчить вашу жизнь без написания каких-либо дополнительных js. https://github.com/bcardarella/client_side_validations