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"

そのため、ビューでは成績のforは必要なく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)モデルに「グレード」と呼ばれるメソッドを作成します。例:

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コールバックで上記のメソッドを作成します

たとえば、データベースの「成績」列に保存しているとしましょう:

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​​ ファイルです。したがって、条件、DB 接続などを設定できます。

しかし、ビューにロジックを含めることはお勧めできません。常にビューのみを表示するようにしてください。すべての処理ロジックはモデルにある必要があります

アイデアは、Fat モデル、Thin コントローラーは、ビューはプレゼンテーションのみです。したがって、あなたの場合、少なくともログインをヘルパーメソッドに入れるようにしてください。

私が気づいたもう1つのことは、この行を持つことができます

 (midtest + finaltest) / 2

 average_marks = (midtest + finaltest) / 2 

他の場所では、よりDRYとして使用average_marksします(Don't Repeat Yourself)

HTH :)

于 2012-11-19T05:31:19.153 に答える