2016-08-30 10 views
0

に基づいて、オブジェクト変数を計算します。Railsの5 - のは、私は3つの変数とRailsの5の計算モデルを持っていると言う二つの他の変数

a - float 
b - float 
add - float 

2つの変数のみが計算で(& b)に存在していますオブジェクトの作成時に表示します。

addition(a, b)関数をコントローラから呼び出すと、オブジェクトがデータベースに保存される前に "add"変数が計算されます。

calculations_controller.rbのこの機能(または類似)を使用して、結果を計算してデータベースに保存するにはどうすればよいですか?これは、オブジェクトが更新されるたびに呼び出される必要があります。

現在の考え方:この関数は、コントローラの作成機能と更新機能の両方で呼び出される必要があります。または、おそらくbefore_saveコールバックを使用します。しかし、コントローラのオブジェクト・パラメータの@calculationオブジェクト・ファンクションに関数の結果を代入する方法については少し不便です。

class Calculation < ApplicationRecord 
    def addition(a, b) 
     return a + b 
    end 
end 

コントローラ例:

class CalculationsController < ApplicationController 
    def create 
     # calculate and assign to :add variable here? 
     @calculation = Calculation.new(calculation_params) 

    respond_to do |format| 
     if @calculation.save 
     ... redirect_to ... 
     else 
     ... render :new ... 
     end 
    end 
    end 
+0

新しいクラスを作成するときはまず小さなものが必要ですが、 'class'という単語は小文字にする必要があります。クラス計算 davidhu2000

+0

あなたは '@calculation = addition(a、b)'のようなことをすることができます – davidhu2000

+0

@ davidhu2000 re:スペルありがとう、更新済み! re:addition - 現在の関数は、計算された値を返します(add変数を参照しません)。 '@計算'は計算オブジェクト全体を指し、オブジェクト内の特定の変数ではありません。私はそれが動作するとは思わない –

答えて

0

は、だからあなたのコントローラ内、あなたはだからあなたのモデル内でこの

# params => { a: 1.0, b: 2.0 } 

@calculation = Calculation.new(params) 
if @calculation.save 
    redirect_to @calculation 
else 
    render :new 
end 

のようなものを持っていること、

class Calculation < ApplicationRecord 
    before_save :addition 

    private 

    def addition 
    add = a + b 
    end 
end 

しかし、存在を検証している場合a,baddの場合、addの値を設定する代わりにbefore_validationコールバックを使用できます。

コールバックのリストと順序については、http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.htmlを参照してください。

+0

恐ろしい感謝@コバルト - 私は 'before_save'& 'before_validation'コールバックが必要ですが、追加メソッドを' self.add = a + b'に調整する必要がありました これで、変数に 'self.'が追加された場合にのみメソッドが機能するのですか?どちらも働かないといけない? –

+0

[記事](http://stackoverflow.com/questions/1693243/instance-variable-self-vs)は物事をうまく説明しています。 –

関連する問題