重载ActiveSupport的默认to_sentence行为

时间:2009-08-26 11:49:41

标签: ruby-on-rails ruby activesupport

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 '的最类似红宝石的方式是什么?

3 个答案:

答案 0 :(得分:12)

嗯,它是可本地化的,因此support.array.last_word_connector

只能specify a default'en'的值为'和'

见:

来自:conversion.rb

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

分步指南:

首先,创建一个rails项目

rails i18n

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

en:
  support:
    array:
      last_word_connector: " and "

最后,它有效:

 
Loading development environment (Rails 2.3.3)
>> [1,2,3].to_sentence
=> "1, 2 and 3"

答案 1 :(得分:-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

答案 2 :(得分:-1)

作为如何覆盖一般方法的答案,帖子here提供了一种很好的方法。它没有与别名技术相同的问题,因为没有剩余的“旧”方法。

这里你可以如何将这种技术用于原始问题(用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在结束语句之后超出范围,因此对于将来使用Array不是问题。