正确的测试Rails版本的方式用于Ruby Gem开发

9

如何在基于Rails版本的gem中正确处理条件流程?

由于Rails 4更改了一些内容,因此我需要根据Rails主要版本为4与3或之前的版本来有条件地进行流程控制。

我最接近的解决方案是:

if Rails.version.split(".").first.to_i < 4
    # Do the Rails 4 thing
else 
    # Do it the old way
end

你的Gemfile中没有指定Rails版本吗? - Nobita
我正在编写一个 gem,它需要支持 Rails 从版本 2.x 到 4.x。不幸的是,Rails 4 改变了其中一个核心 ActiveSupport 组件(实际上分解成了自己的 gem),因此我需要为 Rails 4 更改 gem 的行为(它仍然可以正常工作于版本 2.x - 3.x)。 - Michael Lang
我不确定你是否能够做到这一点。我的想法是,一旦你的 gem 构建完成,Rubygems 将运行该代码并创建其静态表示形式... - Nobita
以上代码是可行的,但我认为这不是 Rails 的正确使用方式。我只需要在运行/加载时检查 Rails 版本,以便 gem 能够适当地支持每个版本的 Rails。 - Michael Lang
"4.0.1".to_i4。如果你不关心小数点后面的内容,就不需要分割。 - tadman
@Nobita 唯一“静态”的是你的.gemspec文件。你的 gem 中的所有 Ruby 代码仍然是活动代码。 - tadman
3个回答

20
Rails在Rails::VERSION下定义了各种补丁级别的常量:MAJORMINORTINYPRE(如果适用)。版本字符串由这些整数构成,您可以直接使用它们:
if Rails::VERSION::MAJOR >= 4
  # Do the new thing
else
  # Do it the old way
end

这些功能至少可以追溯到Rails 2.0.x,因此它们可以安全地用于您的gem的允许依赖规范。

0

个人认为,Rails.version =~ /^4/ 读起来更好。


Rails.version.to_i >= 4 也是一种选择。 - tadman

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接