2016-06-01 16 views
0

Ziemlich neu bei RoR. Frage mich, ob mir jemand bei diesem Problem helfen kann.Übergang von einem Controller zu einem Modell

Ich habe ein Juwel namens "business_time", die die Werktage zwischen zwei Daten berechnet. Ich habe eine Methode in dem Modell eingerichtet, das alle Berechnungen durchführt.

Ich habe ein Feld namens "Kredit", die die Anzahl der Werktage halten sollte. Hier ist, was ich habe:

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 

Ich habe einen Fehler etwas über eine Zeichenfolge verweisen.

Wie gehe ich darüber hinaus die Daten aus der Methode in das Feld "Kredit" gespeichert?

Danke Jungs.

+0

Was ist der genaue Fehler? Bitte poste es in der Frage. Auch, wie ich sehen kann, verwenden Sie 'calculate_days' anstelle von' calculate', was Ihre Modellmethode ist. – Pavan

+0

'Date.parase'? Meinst du "Date.parse"? – spickermann

+0

@spickermann und Pavan, whoops. Tippen Sie es falsch hier ein. Aber ist das der richtige Weg, um von einem Controller zu einem Model zu gelangen? Wie gehe ich vor, um die Daten im Feld "Kredit" zu speichern? – Jose

Antwort

1

sein sollte, ich glaube, es keine Notwendigkeit für eine zusätzliche Methode, da alle Attribute (from_date, end_date und credit) im selben Modell gespeichert sind.

Ich würde gesetzt gerade from_date und end_date in der Initialisierungsliste und berechnen credit mit einem Rückruf vor der Validierung:

# 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

Arbeitete wie ein Charme! Ich musste '+ 1' am Ende des' self.credit' hinzufügen. Ansonsten super! – Jose

+0

@Jose: Sie haben recht, das passiert, weil 'business_days_until' nicht das' from_day' enthält, sondern nur die Anzahl der Werktage zählt, bis das 'to_day' erreicht ist. Ich habe meine Antwort aktualisiert. – spickermann

+0

Super! Du bist ein Champion. Danke noch einmal. – Jose

1

Was Sie hier brauchen, ist Pass String Objekte statt Symbol Objekte.

Also statt @vacations = Vacation.calculate(:from_date, :to_date), müssen Sie wahrscheinlich params[:from_date] und params[:to_date] passieren die Saiten wie 20/01/2016 sein sollte, etc ...

Ihr Code

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

Das scheint mir richtig zu sein, wenn Sie tatsächlich Parameter an die '# neue' Aktion übergeben. Wenn nicht, könnten Sie in der Funktion Standardargumente (wie "Date.today" und "Date.today + 1") setzen, wenn dies für Ihren Kontext sinnvoll ist. –

+0

Vielen Dank für Ihre Hilfe, aber ich bekomme den folgenden Fehler: 'keine implizite Umwandlung von Nil in String' – Jose

+0

Also Ihre' params [: from_date] 'oder' params [: to_date] 'ist Null, das ist ein Fehler von 'Date # Parse' –

Verwandte Themen