2

ActiveSupport 提供了很好的方法to_sentence。因此,

require 'active_support'
[1,2,3].to_sentence  # gives "1, 2, and 3"
[1,2,3].to_sentence(:last_word_connector => ' and ')  # gives "1, 2 and 3"

可以更改最后一个单词的连接器很好,因为我不喜欢多余的逗号。但它需要很多额外的文本:44 个字符而不是 11 个!

问题:将默认值更改为最类似于红宝石的方法是:last_word_connector什么' and '

4

3 回答 3

12

好吧,它是可本地化的,所以你可以只为 ' 和 '指定一个默认的 'en' 值support.array.last_word_connector

看:

来自:conversion.rb

def to_sentence(options = {})
...
   default_last_word_connector = I18n.translate(:'support.array.last_word_connector', :locale => options[:locale])
...
end

分步指南:

一、创建一个rails项目

导轨 i18n

接下来,编辑您的 en.yml 文件:vim config/locales/en.yml

zh:
  支持:
    大批:
      last_word_connector:“和”

最后,它起作用了:

 
加载开发环境(Rails 2.3.3)
>> [1,2,3].to_sentence
=> "1、2 和 3"
于 2009-08-26T12:02:52.130 回答
-1
 class Array
   alias_method :old_to_sentence, :to_sentence
   def to_sentence(args={})
     a = {:last_word_connector => ' and '}
     a.update(args) if args
     old_to_sentence(a)
   end
 end
于 2009-08-26T12:16:36.277 回答
-1

作为一般如何覆盖方法的答案,这里的一篇文章提供了一种很好的方法。它不会遇到与别名技术相同的问题,因为没有剩余的“旧”方法。

在这里,您如何使用该技术解决您的原始问题(使用 ruby​​ 1.9 测试)

class Array
  old_to_sentence = instance_method(:to_sentence)
  define_method(:to_sentence) { |options = {}|

    options[:last_word_connector] ||= " and "
    old_to_sentence.bind(self).call(options)
  }
end

如果上面的代码令人困惑,您可能还需要阅读UnboundMethod 。请注意,old_to_sentence 在 end 语句之后超出了范围,因此对于 Array 的未来使用来说这不是问题。

于 2009-08-26T13:03:24.523 回答