0

我想将期中考试和期末考试成绩计算为成绩。例如:

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
4

2 回答 2

3

还在猜测你真正想要什么以及为什么你认为你必须在视图中这样做......

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

我建议:

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

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 %>

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

或者

before_save2)您在回调上创建上述方法

例如,假设您将其存储到数据库的“等级”列中:

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 %>
于 2012-11-19T06:26:52.523 回答
2

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

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

想法是,胖模型,瘦控制器是视图,仅用于演示。因此,在您的情况下,请尝试至少让您登录到辅助方法。

我注意到的另一件事,你可以有这条线

 (midtest + finaltest) / 2

 average_marks = (midtest + finaltest) / 2 

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

HTH :)

于 2012-11-19T05:31:19.153 回答