计算轨道上的ruby视图中的数字

时间:2012-11-19 05:10:50

标签: ruby-on-rails

我想计算中期测试和最终测试成绩。 E.g:

mid test = 80 , final test = 80
(midtest + finaltest)/2 >=80
grade = "A"

是否可以在视图中执行if条件并插入数据库?类似的东西:

 if (midtest + finaltest) / 2 >= 80
      grade = "A"
    elsif (midtest + finaltest)/2 >= 70 and < 80
      grade = "B"
    elsif (midtest + finaltest) /2 >= 60 and < 70
      grade = "C"

因此,在视图中,我们不需要text_field等级,因此计算会自动插入到数据库中。

这是解决方案

控制器

def create

    @nilai = Nilai.new(params[:nilai])
    @nilai.get_grade
    respond_to do |format|
      if @nilai.save
        format.html { redirect_to @nilai, notice: 'Nilai was successfully created.' }
        format.json { render json: @nilai, status: :created, location: @nilai }
      else
        format.html { render action: "new" }
        format.json { render json: @nilai.errors, status: :unprocessable_entity }
      end
    end

  end


模型
class Nilai < ActiveRecord::Base

  attr_accessible :grade, :id_makul, :id_mhs, :id_nilai, :uas, :uts

  def get_grade

    @calculate = (self.uas + self.uts)/2
    if @calculate >= 80
      self.grade = "A"
      elsif @calculate >=70 and @calculate < 80
        self.grade = "B"
      elsif @calculate >=60 and @calculate <70
        self.grade = "C"
      elsif @calculate >=50 and @calculate <60
        self.grade = "D"
    else
      self.grade = "E"
    end  
  end

end

2 个答案:

答案 0 :(得分:3)

仍在猜测你真正想要的是什么以及为什么你认为你必须在视图中做到这一点......

正如我上面所说,视图应仅用于显示已存在数据的代码。将内容插入数据库的代码适用于您的模型和控制器。

我建议:

1)您在模型上创建一个名为“等级”的方法,例如:

def grade
  if (midtest + finaltest) / 2 >= 80
    return "A"
  elsif (midtest + finaltest)/2 >= 70 and < 80
    return "B"
  elsif (midtest + finaltest) /2 >= 60 and < 70
    return "C"
  else
    return "F"
  end
end

现在,您可以从您的视图中调用此方法,例如:

Grade: <%=  @my_model.grade %>

请注意,此方法不会将其插入数据库。

2)您在before_save回调

上创建了上述方法

例如,假设您将其存储在db:“/ p”中的“grade”列中

class MyModel < ActiveRecord::Base

  before_create :calculate_grade

  def calculate_grade
    if (midtest + finaltest) / 2 >= 80
      self.grade = "A"
    elsif (midtest + finaltest)/2 >= 70 and < 80
      self.grade = "B"
    elsif (midtest + finaltest) /2 >= 60 and < 70
      self.grade = "C"
    else
      self.grade = "F"
    end
  end
end

现在,无论何时保存模型,都会从测试分数中重新计算成绩,并将其保存到数据库中。 所以你可以在你的视图中使用“等级”,但它来自数据库专栏

Grade: <%=  @my_model.grade %>

答案 1 :(得分:2)

从技术上讲,你可以在视图中做任何事情,毕竟视图也是一个ruby文件。所以你可以有条件,数据库连接等。

但是,不是一个好习惯让你的观点有你的逻辑。始终尝试仅显示您的视图。所有处理逻辑都应该在模型中

理念是,Fat模型,瘦控制器视图仅用于演示。因此,在您的情况下,尝试至少看到登录到帮助方法。

我注意到的另一件事是,你可以拥有这一行

 (midtest + finaltest) / 2

 average_marks = (midtest + finaltest) / 2 

并在其他地方使用average_marks,因为它更干(不要重复自己)

HTH :)