Перегрузка ActiveSupport по умолчанию поведение to_sentence - PullRequest
2 голосов
/ 26 августа 2009

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 ]

12 голосов
/ 26 августа 2009

Ну, это локализуемо, поэтому вы можете просто указать значение по умолчанию 'en' значение 'и' для support.array.last_word_connector

См .:

от: translation.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

en:
  support:
    array:
      last_word_connector: " and "

Наконец-то работает:

 
Loading development environment (Rails 2.3.3)
>> [1,2,3].to_sentence
=> "1, 2 and 3"
0 голосов
/ 26 августа 2009

В качестве ответа на вопрос о том, как переопределить метод в целом, сообщение здесь дает хороший способ сделать это. Он не страдает от тех же проблем, что и метод псевдонима, так как не существует «старого» метода.

Вот как вы можете использовать эту технику с вашей первоначальной задачей (протестировано с 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 в будущем.

0 голосов
/ 26 августа 2009
 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
...