如果我正确地理解了您的问题,那么您有 4 个具有碱基的东西,并且您希望在用户在 number_field_tags 中输入信息时动态地向他们显示碱基总数。为了实现这一点,我使用上面的代码片段并将“bases”类分配给每个 number_field_tags,并将“total-bases”的 id 分配给要显示总数的跨度。
<td class="method2">
<p>Input the number of each base the primer should have</p>
<label>Number of A :</label>
<%= number_field_tag(:no_A,nil, in:0...36, class: 'bases') %><br />
<label>Number of T :</label>
<%= number_field_tag(:no_T,nil, in:0...36, class: 'bases') %><br />
<label>Number of G :</label>
<%= number_field_tag(:no_G,nil, in:0...36, class: 'bases') %><br />
<label>Number of C :</label>
<%= number_field_tag(:no_C,nil, in:0...36, class: 'bases') %><br />
Total bases:<span id="total-bases"></span>
</td>
然后我编写了以下 jQuery 代码:
$(document).on("keyup change", ".bases", function() {
totalSides();
});
function totalSides() {
var tmp = 0;
var total = 0;
$(".bases").each(function() {
tmp = parseInt($(this).val(), 10);
if (isNaN(tmp)) {
tmp = 0;
};
total = total + tmp;
});
$("#total-bases").html(total);
};
它的作用是在 number_field_tag 框内的任何 keyup 或更改上,totalSides 函数将运行。totalSides 函数将临时变量 (tmp) 设置为 0,并将变量 total 设置为 0。然后它使用“bases”类遍历每个 number_field_tag。它将内容解析为整数。如果输入不是数字 (isNaN),它会通过将 tmp 设置为 0 来转储它,否则它将变量 total 设置为 td 中所有 number_field_tags 内的值的总和。
然后它将跨度中的 html 设置为此总数。
我认为这就是您正在寻找的东西,希望这会有所帮助。如果您还有其他问题,请告诉我,我会尽力提供帮助。
只需重新考虑您的验证问题并意识到,您可以只使用内置的 number_field_tag 选项。您可以使用:
min: 6
max: 36
甚至更简单,我们 :in => 6...36
in: 6...37
作为每个 number_field_tag 的选项。这比我的第一个想法要简单得多……这将使用 jQuery Validation 插件库……但是,当您想要对不太容易添加的东西进行验证时,熟悉 Validation 库是一件好事作为 rails 表单助手的选项。
您的原始代码使用 in:0...36 - 应该像将 0 更改为 6 和 36 更改为 37 一样简单,从而为您提供 6-36 的允许范围。如果不是,请告诉我,我将重新包含一些 jQuery 验证代码并将您设置在该路径上。
http://apidock.com/rails/ActionView/Helpers/FormTagHelper/number_field_tag
http://jqueryvalidation.org/documentation/
以下是 jQuery 验证方法的一些示例代码:
jQuery.validator.addMethod("no-zero", function(value, element) {
return this.optional(element) || !/^0$/.test(value);
}, "Cannot be zero.");
基本上,只需用正确的正则表达式替换正则表达式以验证 6 到 36 之间的值,然后在用户违反它时编写您想要抛出的错误消息。