В Rails, как добавить новый метод в класс String? - PullRequest
48 голосов
/ 20 сентября 2011

Я хочу создать индекс для различных объектов в моем проекте Rails и хотел бы добавить метод count_occurences, который я могу вызывать для объектов String.

Я видел, что могу сделать что-то вроде

class String
  def self.count_occurences
    do_something_here
  end
end

Каков точный способ определения этого метода и где разместить код в моем проекте Rails?

Спасибо

Ответы [ 3 ]

92 голосов
/ 21 сентября 2011

Вы можете определить новый класс в вашем приложении на lib/ext/string.rb и поместить в него этот контент:

class String
  def to_magic
    "magic"
  end
end

Чтобы загрузить этот класс, вам потребуется указать его в файле config/application.rb или в инициализаторе. Если у вас было много таких расширений, лучше инициализатор! Способ загрузки прост:

require 'ext/string'

Затем метод to_magic будет доступен в экземплярах класса String внутри вашего приложения / консоли, т. Е .:

>> "not magic".to_magic
=> "magic"

Плагины не нужны.

12 голосов
/ 31 марта 2014

Я знаю, что это старый поток, но не похоже, что принятое решение работает в Rails 4+ (по крайней мере, не для меня). Установка файла rb расширения в config / initializers работала.

Кроме того, вы можете добавить / lib в автозагрузчик Rails (в config / application.rb, в классе Application:

config.autoload_paths += %W(#{config.root}/lib)

require 'ext/string'

Смотрите это: http://brettu.com/rails-ruby-tips-203-load-lib-files-in-rails-4/

4 голосов
/ 20 сентября 2011

Если вы хотите расширить некоторый базовый класс, тогда вы обычно хотите создать плагин (это удобно, когда этот код нужен в другом приложении).Здесь вы можете найти руководство, как создать плагин http://guides.rubyonrails.org/plugins.html, а пункт # 3 покажет, как расширить класс String: http://guides.rubyonrails.org/plugins.html#extending-core-classes

...