2016-11-29 45 views
1

對不起,我的英語不好。我必須在Rails中的Date類中添加一個方法,因爲我想使用我翻譯的日期名稱。 所以,我想:如何將方法添加到Rails 5中的現有類?

class Date 
    def date_of_next(day) 
    date = Date.parse(day) 
    delta = date > Date.today ? 0 : 7 
    date + delta 
    end 
end 
在配置/初始化/ date_of_next.rb

,但是當我在我的控制器調用Date.date_of_next(天)我得到「沒有方法日期」。 我該怎麼做?我應該在哪裏放置文件?

+2

您添加了一個實例方法,但使用了單例方法。您應該定義單例方法,以便使用它:'def self.date_of_next(day)...' - 現在您可以執行'Date.date_of_next(day)' –

+0

_「...因爲我想用我的翻譯日期名稱「_ - 這是什麼意思? – Stefan

+1

不要這樣做。 使用I18n本地化 – Fallenhero

回答

1

initializers下的猴子補丁文件放在一邊很好(儘管「好」的猴子補丁本身如此:))。

你想的方法定義修改爲以下幾點:

class Date 
    def self.date_of_next(day) 
    date = parse(day) 
    delta = date > today ? 0 : 7 
    date + delta 
    end 
end 

你的問題是,您呼叫的對象Date上一個單方法,但是它並沒有定義這樣的方法。

+0

我認爲值得一提的是,類方法只是生活在類的單例類中的單例方法。 – nisevi

+1

@ nisevi在Ruby中沒有「class method」這樣的東西;) –

3

Andrey Deineko在他的評論(和現在的答案)中指出,你寫了一個實例方法,但稱爲類方法。嘗試:

class Date 
    def self.date_of_next(day) 
    date = Date.parse(day) 
    delta = date > Date.today ? 0 : 7 
    date + delta 
    end 
end 

其他(可能更好)的方式將更多的面向對象有一個實例方法:

class Date 
    def date_of_next 
    delta = self > Date.today ? 0 : 7 
    self + delta 
    end 
end 

day.date_of_next # you might want to pick a better name 

還有一個提示:猴修補(以這樣的方式擴展現有的類)並不是長期的最佳解決方案。你可能想在某一天切換到不同的模式。

+1

關於使用實例方法的好處! +1 –

相關問題