2017-07-15 20 views
2

Hallo ich bin neu bei Ruby und ich versuche, wie so ein Verfahren, in meinem Projekt-Controller zu machen:NoMethodError in Controller

def update_phase 
    @project = Project.find(params[:id]) 
    diff = (Date.current.year * 12 + Date.current.month) - (@project.starting.year * 12 + @project.starting.month) 
    case 
     when diff >= 30 
      @project.process = 11 
      . 
      . 
      . 
     when diff >= 0 
      @project.process = 1 
     else 
      @project.process = 0 
    end 
    proc = @project.process.to_f 
    case 
     when proc >= 9 
      @project.phase = "Final" 
     when proc >= 5 
      @project.phase = "Desarrollo" 
     when proc >= 1 
      @project.phase = "Inicio" 
     else 
      @project.phase = "Error en el proceso" 
    end 
end 

starting ein Zeitstempel in dem Modell ist. Aus meiner Sicht habe ich: <% @project.update_phase %> aber ich bekomme den Fehler: "NoMethodError in Projects#show" Wie kann ich das beheben?

+0

Was ist 'start'? –

+0

Ich habe versucht, dass aber weder der Prozess noch das Phasenattribut in der Instanz – IvanHid

+0

Start ist ein Zeitstempel im Projektmodell – IvanHid

Antwort

0

Je nachdem, was war oder woher kommt starting herkomme, könnten Sie einen before_save Rückruf verwenden, auf diese Weise jedes Mal wenn Sie einen neuen Datensatz erstellen gehen, es löst die update_phase Methode und ordnet den Wert für process und phase aus dem aktuellen Projektobjekt:

class Project < ApplicationRecord 
    before_save :update_phase 

    ... 

    def update_phase 
    diff = (Date.current.year * 12 + Date.current.month) - (self.starting.year * 12 + self.starting.month) 
    case 
     when diff >= 30 
     self.process = 11 
     ... 
    end 
    proc = self.process.to_f 
    case 
     when proc >= 9 
     self.phase = 'Final' 
     ... 
    end 
    end 
end 
+0

Hoppla, Start ist ein Attribut aus Projekt Ich habe sowohl die Frage und meinen Code aktualisiert und immer noch die gleichen Fehler beim Hinzufügen der Zeile "before_save: update_phase" bringt den Fehler "undefined method' before_save 'für ProjectsController: Klasse meinst du? before_filter "auch die update_phase wird immer dann aufgerufen, wenn das Projekt vom Benutzer aufgelistet wird, so dass es nur schon läuft bestehende Projekte – IvanHid

+0

Sie verwenden die Methode im Controller @ IvanHid, es ist eine Methode für die Klasse Projekt, deshalb ist 'before_save' nicht verfügbar. –

+0

Tut mir leid, ich habe es auf den Controller verschoben, weil es im Modell funktionierte, aber es hat keine der Attribute aktualisiert, es zeigte sie nur für die Seite an, die es hieß – IvanHid