2017-07-15 85 views
2

你好,我是在新的Ruby和我試圖使一個方法在我的項目控制,像這樣:NoMethodError在控制器

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是在模型中的時間戳。在我看來,我有: <% @project.update_phase %> 但我得到的錯誤:"NoMethodError in Projects#show" 我該如何解決這個問題?

+0

什麼是「開始」? –

+0

我試過這樣做,但過程和階段屬性都沒有保存在實例中 – IvanHid

+0

開始是項目模型中的時間戳 – IvanHid

回答

0

根據什麼或來自哪裏starting,你可以使用一個before_save回調,這樣每次你要創建一個新的記錄,它觸發update_phase方法,並從當前分配的processphase值項目對象:

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

糟糕,開始是來自項目的屬性我已經更新了問題和我的代碼,仍然有相同的錯誤,添加行「before_save:update_phase」會導致錯誤「未定義的方法'before_save'for ProjectsController:Class您是否意味着?before_filter」也會在用戶列出項目時調用update_phase,因此它只會在已經運行現有項目 – IvanHid

+0

您正在控制器@IvanHid中使用該方法,這是類Project上的方法,這就是爲什麼'before_save'不可用。 –

+0

對不起,我把它移動到控制器,因爲它在它的模型中工作,但它沒有更新任何屬性,它只顯示它們被稱爲 – IvanHid