如何在Rails 5中为现有类添加方法?

时间:2016-11-29 12:23:00

标签: ruby-on-rails ruby class ruby-on-rails-5

抱歉我的英语不好。我必须在Rails中的Date类中添加一个方法,因为我想使用我的翻译日名称。 所以,我试过了:

class Date
  def date_of_next(day)
    date  = Date.parse(day)
    delta = date > Date.today ? 0 : 7
    date + delta
  end
end
在config / initializers / date_of_next.rb中

但是当我在我的控制器中调用Date.date_of_next(day)时,我得到"在Date"中没有方法。 我怎样才能做到这一点?我应该把文件放在哪里?

2 个答案:

答案 0 :(得分: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)

将猴子修补的文件放在initializers下是好的(尽管“好的”猴子修补本身如何:)。)。

您想要将方法定义更改为以下内容:

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

你的问题是你在对象Date上调用了单例方法,而没有定义这样的方法。