2016-11-29 85 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 –

相关问题