如何计算 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)
      }
    });