2016-06-01 28 views
0

RoRに新しくなりました。誰もがこの問題で私を助けることができれば驚いています。コントローラからモデルへの受け渡し

私は、2つの日付の間の営業日を計算する "business_time"と呼ばれる宝石を手に入れました。私はすべての計算を行うモデルでメソッドを設定しました。

私は営業日数を保持する「クレジット」というフィールドを持っています。ここで私が持っているものです。

MODEL

def self.calculate(from_date,to_date) 
    days = 0 

    date_1 = Date.parse(from_date) 
    date 2 = Date.parse(to_date) 
    days = date_1.business_days_until(date2) 

    days 
end 

CONTROLLER

def new 
    @vacation = current_user.vacations.build 
    @vacations = Vacation.calculate(:from_date, :to_date) 
end 

私は、文字列について何かを参照するエラーを得ました。

また、メソッドのデータを「クレジット」というフィールドに格納するにはどうすればよいですか?

ありがとうございます。

+0

正確なエラーとは何ですか?質問に投稿してください。また、あなたのモデルメソッドである 'calculate'の代わりに' calculate_days'を使用しているのがわかります。 – Pavan

+0

'Date.parase'? 'Date.parse'を意味しますか? – spickermann

+0

@spickermannとPavan、whoops。それを間違って入力しました。それにもかかわらず、コントローラーからモデルに正しく通り過ぎる方法はありますか? 「クレジット」フィールドにデータを保存するにはどうすればよいですか? – Jose

答えて

1

する必要があります私はする必要はないと思いますすべての属性(from_date,end_dateおよびcredit)が同じモデルに格納されているため、余分な方法です。

私はちょうど初期化子でfrom_dateend_dateを設定し、検証の前にコールバックしてcreditを計算します:

# in the model 
before_validation :calculate_credit 

private 
    def calculate_credit 
    if from_date && to_date 
     # `+ 1` because the user takes off both days (`from_date` and `to_date`), 
     # but `business_days_until` doesn't count the `from_day`. 
     self.credit = from_date.business_days_until(to_date) + 1 
    end 
    end 

# in the controller 
def new 
    @vacation = current_user.vacations.build 
end 

def create 
    @vacation = current_user.vacations.build(vacation_params) 

    if @vacation.save 
    # @vacation.credit would return the calculated credit at this point 
    else 
    # ... 
    end 
end 

private 
    def vacation_params 
    params.require(:vacation).permit(:from_date, :to_date) 
    end 
+0

魅力的に働いた! 'self.credit'の最後に' + 1'を追加しなければなりませんでした。それ以外、素晴らしい! – Jose

+0

@Jose:そうです。これは、 'business_days_until'に' from_day'が含まれていないので、 'to_day'に達するまでの営業日数しかカウントされないためです。私は自分の答えを更新しました。 – spickermann

+0

驚くばかり!あなたはチャンピオンです。再度、感謝します。 – Jose

1

Symbolオブジェクトの代わりにStringオブジェクトを渡す必要があります。

ので、代わりの@vacations = Vacation.calculate(:from_date, :to_date)、あなたはおそらく20/01/2016、などのような文字列であるべきparams[:from_date]params[:to_date]を渡す必要があります...

あなたのコードは

@vacations = Vacation.calculate(params[:from_date], params[:to_date]) 
+0

あなたが本当に '#new'アクションにパラメータを渡しているのなら、それは正しいと思います。もしそうでなければ、あなたのコンテキストに合っているならば、関数にデフォルトの引数( 'Date.today'や' Date.today + 1'など)を設定することができます。 –

+0

助けていただきありがとうございます。次のエラーが表示されます。 'nilを文字列に暗黙的に変換しない ' – Jose

+0

' params [:from_date] 'または' params [:to_date] 'がnil 'Date#parse'から –

関連する問題