2016-11-29 7 views
1

私の悪い英語のために申し訳ありません。私は翻訳された曜日名を使用したいので、RailsのDateクラスにメソッドを追加する必要があります。設定/初期化子/ date_of_next.rbでRails 5の既存のクラスにメソッドを追加するにはどうすればよいですか?

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

しかし、私は私のコントローラでDate.date_of_next(日)を呼び出すとき、私は「日中何も方法」を取得していない: だから、私が試してみました。 どうすればいいですか?ファイルはどこに置くべきですか?

+2

インスタンスメソッドを追加しましたが、シングルトン1を使用しました。 '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には「クラスメソッド」というものはありません; –

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 –

関連する問題