【问题标题】:How do I extend the Time class in a rails app?如何在 Rails 应用程序中扩展 Time 类?
【发布时间】:2014-01-16 02:57:18
【问题描述】:

基本上我想扩展 Time 类来添加这个方法:

def round_to_fifteen()
    return Time.at((self.to_i / 900).round * 900)
end

如何实现这一点,我应该将扩展类的文件放在哪里?

【问题讨论】:

标签: ruby-on-rails ruby ruby-on-rails-4


【解决方案1】:

你可以把它放在任何你想用的地方,你可以写

    class Time

      def round_to_fifteen
        return Time.at((self.to_i / 900).round * 900)
      end
    end

要使用它,您只需编写

timestamp_object.round_to_fifteen

【讨论】:

  • 我不是 Python 人,但我确实回答了这个问题,不是吗?
  • 这是行不通的——如果你想扩展 Time 类,你必须重新打开它。此代码定义了一个新的UsersHeper::Time 类,它与::Time 类不同。
  • 哈!你说得对,我太愚蠢了。我已编辑我的答案以提高准确性
【解决方案2】:

传统上,这种事情发生在lib/。我只需要 lib/time_extensions.rb 之类的东西,这是初始化程序所必需的。

您只需重新打开 Time 类并添加所需的方法,如下所示:

class Time
  def round_to_fifteen()
    return Time.at((self.to_i / 900).round * 900)
  end
end

然后,任何 Time 对象都将具有可用的#round_to_fifteen 方法。您可以在控制台中看到:

2.0.0p247 :004 > class Time
2.0.0p247 :005?>   def round_to_fifteen()
2.0.0p247 :006?>       return Time.at((self.to_i / 900).round * 900)
2.0.0p247 :007?>     end
2.0.0p247 :008?> end
 => nil
2.0.0p247 :009 > Time.now.round_to_fifteen
 => 2013-12-28 13:15:00 -0700

【讨论】:

  • 我很抱歉成为一个完整的“菜鸟”,但我如何从初始化程序中要求它?
  • Rails 有 config/initializers 目录。你可以在那里创建一个文件(我喜欢我的文件,比如01_includes.rb 或诸如此类的东西),然后在那里创建require File.join(Rails.root, 'lib/time_extensions')。这将在 Rails 启动时需要您的扩展文件,重新打开 Time 类并添加您的方法。
猜你喜欢
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
  • 2012-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多