如何将方法添加到 Rails 5 中的现有 class?

How can i add a method to an existing class in Rails 5?

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

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) 时,我得到 "no method in Date"。 我怎样才能做到这一点?我应该把文件放在哪里?

将猴子补丁文件放在 initializers 下很好(尽管 "good" 猴子补丁本身是这样的:))。

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

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

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

正如 Andrey Deineko 在他的评论(以及现在的回答)中指出的那样,您编写了一个实例方法但调用了一个 class 方法。尝试:

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

还有一个提示:猴子补丁(以这种方式扩展现有 class)不是较长 运行 上的最佳解决方案。有一天你可能想切换到不同的模式。