如何计算 rails 上 ruby 中嵌套字段的百分比
how to calculate percentage for nested fields in ruby on rails
我在控制器中加载页面时设置了默认的 3 个嵌套属性字段
def new
@candidate = Candidate.new
#@candidate.educations.build
3.times do
education = @candidate.educations.build
end
结束
我在我的 candidates.coffee 文件中使用 jquery 计算嵌套字段的百分比
$('#max_marks, #marks_obtained').keyup ->
max_marks = parseFloat($('#max_marks').val()) or 0
marks_obtained = parseFloat($('#marks_obtained').val()) or 0
$('#percentage').val marks_obtained * 100 / max_marks
return
在_education_fields.html.erb我有我的字段
<div class="form-group">
<%= f.label :max_marks %><br>
<%= f.text_field :max_marks, id: 'max_marks' %>
</div>
<div class="form-group">
<%= f.label :marks_obtained %><br>
<%= f.text_field :marks_obtained, id: 'marks_obtained'%>
</div>
<div class="form-group">
<%= f.label :percentage %><br>
<%= f.text_field :percentage, id: 'percentage' %>
</div>
现在我可以计算第一个字段的百分比,但是第二个和第三个字段我无法应用 jquery 因为 3 个字段的 ID 相同 我如何计算其他 2 个字段的百分比
在html.erb中使用时,rails在嵌套关联中提供了child_index
项。
以下代码可能会解决您的问题。
<div class="education_<%= f.options[:child_index] %>">
<div class="form-group">
<%= f.label :max_marks %><br>
<%= f.text_field :max_marks, class: 'max_marks', data: {index: f.options[:child_index]} %>
</div>
<div class="form-group">
<%= f.label :marks_obtained %><br>
<%= f.text_field :marks_obtained, class: 'marks_obtained', data: {index: f.options[:child_index]}%>
</div>
<div class="form-group">
<%= f.label :percentage %><br>
<%= f.text_field :percentage, class: 'percentage' %>
</div>
</div>
$('.max_marks, .marks_obtained').focusout(function(event){
var target = $(event.target), parent = target.parents().find('.education_' + target.attr('data-index'));
if (parseInt(parent.find('.marks_obtained').val()) > parseInt(parent.find('.max_marks').val())){
alert('Marks Obtained cannot be greater then Maximun Marks');
parent.find('.marks_obtained').val('');
} else {
var max_marks = parseFloat(parent.find('.max_marks').val())
var marks_obtained = parseFloat(parent.find('.marks_obtained').val())
max_marks = max_marks === NaN ? 0 : max_marks
marks_obtained = marks_obtained === NaN ? 0 : marks_obtained
parent.find('.percentage').val(marks_obtained * 100 / max_marks)
}
});
我在控制器中加载页面时设置了默认的 3 个嵌套属性字段
def new
@candidate = Candidate.new
#@candidate.educations.build
3.times do
education = @candidate.educations.build
end
结束 我在我的 candidates.coffee 文件中使用 jquery 计算嵌套字段的百分比
$('#max_marks, #marks_obtained').keyup ->
max_marks = parseFloat($('#max_marks').val()) or 0
marks_obtained = parseFloat($('#marks_obtained').val()) or 0
$('#percentage').val marks_obtained * 100 / max_marks
return
在_education_fields.html.erb我有我的字段
<div class="form-group">
<%= f.label :max_marks %><br>
<%= f.text_field :max_marks, id: 'max_marks' %>
</div>
<div class="form-group">
<%= f.label :marks_obtained %><br>
<%= f.text_field :marks_obtained, id: 'marks_obtained'%>
</div>
<div class="form-group">
<%= f.label :percentage %><br>
<%= f.text_field :percentage, id: 'percentage' %>
</div>
现在我可以计算第一个字段的百分比,但是第二个和第三个字段我无法应用 jquery 因为 3 个字段的 ID 相同 我如何计算其他 2 个字段的百分比
在html.erb中使用时,rails在嵌套关联中提供了child_index
项。
以下代码可能会解决您的问题。
<div class="education_<%= f.options[:child_index] %>">
<div class="form-group">
<%= f.label :max_marks %><br>
<%= f.text_field :max_marks, class: 'max_marks', data: {index: f.options[:child_index]} %>
</div>
<div class="form-group">
<%= f.label :marks_obtained %><br>
<%= f.text_field :marks_obtained, class: 'marks_obtained', data: {index: f.options[:child_index]}%>
</div>
<div class="form-group">
<%= f.label :percentage %><br>
<%= f.text_field :percentage, class: 'percentage' %>
</div>
</div>
$('.max_marks, .marks_obtained').focusout(function(event){
var target = $(event.target), parent = target.parents().find('.education_' + target.attr('data-index'));
if (parseInt(parent.find('.marks_obtained').val()) > parseInt(parent.find('.max_marks').val())){
alert('Marks Obtained cannot be greater then Maximun Marks');
parent.find('.marks_obtained').val('');
} else {
var max_marks = parseFloat(parent.find('.max_marks').val())
var marks_obtained = parseFloat(parent.find('.marks_obtained').val())
max_marks = max_marks === NaN ? 0 : max_marks
marks_obtained = marks_obtained === NaN ? 0 : marks_obtained
parent.find('.percentage').val(marks_obtained * 100 / max_marks)
}
});