Tag: activesupport

3.days.ago,2.hours.from_now等没有Rails?

有些书提到了一些用#days , #megabytes , #minutes #days来装饰数字的gem等。这只是在ActiveSupport中,还是有一个较小的gem提供这个function用于(小)非铁轨gem? 我想在一个小小的gem中使用这个function作为DSL的一部分。

在特定时区的某一天开始获取时间对象

如何获得一个ruby Time对象,该对象表示给定时区中特定日期的一天的开始。

有没有办法覆盖`{}`对象?

我试图让我的程序中的所有哈希都是ActiveSupport :: OrderedHash。 我可以通过::Hash = ActiveSupport::OrderedHash覆盖Hash.new构造函数但{}.class仍然是哈希。 def {}给我一个语法错误。 建议这是这个问题的副本,但我不认为是这种情况。 我的问题不是关于子类化Hash,而是关于覆盖默认的{ } => Hash构造函数。

覆盖ActiveSupport :: Concern模块中的方法,这些方法由同一模块中的类方法定义

我有一个ActiveSupport :: Concern模块,看起来大致如下: module MyModel module Acceptance extend ActiveSupport::Concern included do enum status: [:declined, :accepted] end def declined! self.status = :declined # some extra logic self.save! end def accepted! self.status = :accepted # some extra logic self.save! end end end 这只会被包含在ActiveRecord类中,因此使用enum 。 基本上,我压倒了declined! 并accepted! 由ActiveRecord::Enum.enum创建的方法,以及我自己的一些额外的自定义逻辑。 问题是,这不起作用,因为当我调用@model.declined! 它只是调用原来执行的declined! 并忽略我的自定义方法。 看起来我的自定义方法在运行包含块之前被包含到调用类中 – 这意味着我的自定义方法被enum定义的方法覆盖,而不是相反。 在这种特殊情况下有一些简单的解决方法(例如,我可以将调用enum移回包含类并确保它在行上方include MyModel::Acceptance ,但我想知道是否有一种方法可以解决此问题同时保持这一切都在同一个模块中。 有没有什么方法可以调用included在定义实例方法的类方法,然后在同一个Concern模块中覆盖该实例方法?

在Rails 4.1中,validates_inclusion_of不再一样吗?

以下代码确保time_zone选择在ActiveSupport::TimeZone.us_zones的时区内: validates_inclusion_of :time_zone, in: ActiveSupport::TimeZone.zones_map(&:name) 在Rails 4.0中工作得很好。 刚升级到Rails 4.1,我在索引页面上收到此错误(所以只需查看模型): #include方法的对象? 或者需要proc,lambda或symbol,并且必须作为配置哈希的in(或:within)选项提供 我猜测, ActiveSupport::TimeZone.zones_map(&:name)不再是in属性的有效值?

Ruby没有找到新版本的OpenSSL

OpenSSL::OPENSSL_VERSION_NUMBER何时OpenSSL::OPENSSL_VERSION_NUMBER地设置? 为什么不设置我刚刚安装的最新OpenSSL? 首先是错误: $ gem install activesupport -v ‘3.2.13’ Error while executing gem … (RuntimeError) Unsupported digest algorithm (SHA512) 如果我直接进入irb,我可以看到Ruby正在使用“旧”openssl: $ irb >> require ‘openssl’ => true >> OpenSSL::Digest.new(‘sha512’) RuntimeError: Unsupported digest algorithm (sha512) >> OpenSSL::OPENSSL_VERSION_NUMBER.to_s(16) “9070cf” 这告诉我Ruby没有找到我刚刚构建的OpenSSL的本地版本,它至少应该是0x908000。 相关代码: # file: usr/lib/ruby/2.0.0/openssl/digest.rb … alg = %w(DSS DSS1 MD2 MD4 MD5 MDC2 RIPEMD160 SHA SHA1) if […]

将Date对象转换为TimeWithZone

我需要将Date对象转换为TimeWithZone对象,该对象表示给定时区中那天的开始。 以下方法有效,但似乎太复杂,因为它要求我将日期转换为字符串: ?> date = Date.parse(“2010-02-17”) => Wed, 17 Feb 2010 >> ActiveSupport::TimeZone[‘Eastern Time (US & Canada)’].parse(date.to_s) => Wed, 17 Feb 2010 00:00:00 EST -05:00 >> ActiveSupport::TimeZone[‘UTC’].parse(date.to_s) => Wed, 17 Feb 2010 00:00:00 UTC 00:00 有没有更好的方法我错过了? 编辑:人们建议的变体: ?> date.to_datetime.in_time_zone(‘Eastern Time (US & Canada)’).beginning_of_day => Tue, 16 Feb 2010 00:00:00 EST -05:00 正如你所看到的,这不是一个等价的转换,因为它让我在2月16日美国东部时间开始,而不是2月17日美国东部时间的开始。

测试使用ActiveRecord的问题/模块

场景我提取了一个名为Taggable 。 它是一个允许任何模型支持标记的模块。 我已将此问题/模块包含在User , Location , Location , Projects 。 我想为这个模块编写测试,但不知道从哪里开始。 题 1.我可以对Taggable问题进行隔离测试吗? 在下面的示例中,测试失败,因为测试正在查找dummy_class table 。 我假设它正在这样做是因为Taggable中的has_many代码,因此它希望’DummyClass’成为ActiveRecord对象。 # /app/models/concerns/taggable.rb module Taggable extend ActiveSupport::Concern included do has_many :taggings, :as => :taggable, :dependent=> :destroy has_many :tags, :through => :taggings end def tag(name) name.strip! tag = Tag.find_or_create_by_name(name) self.taggings.find_or_create_by_tag_id(tag.id) end end # /test/models/concerns/taggable_test.rb require ‘test_helpers’ class DummyClass end […]

你如何处理ActiveSupport :: JSON和JSON gem之间的冲突?

我很难过这个问题。 ActiveSupport::JSON在各种核心对象上定义了to_json ,JSON gem也是如此。 但是,实现方式并不相同 – ActiveSupport版本接受参数,而JSON gem版本则不接受参数。 我安装了一个需要JSON gem的gem,我的应用程序坏了。 问题是我在一个返回对象列表的控制器中使用to_json ,但我想控制返回哪些属性。 当我的系统中的任何地方的代码确实require ‘json’我收到以下错误消息: TypeError: wrong argument type Hash (expected Data) 我尝试了一些我在网上阅读的东西来修复它,但没有任何效果。 我最终重写了gem以使用ActiveSupport::JSON.decode而不是JSON.parse 。 这有效,但它不可持续……每次我想要使用需要JSONgem的gem时,我都无法分配gem。 更新:此问题的最佳解决方案是升级到Rails 2.3或更高版本,修复它。