У Ruby on Rails, щоб розширити клас String, куди слід вводити код?


79

Якщо на Ruby on Rails, мені потрібно додати метод, який називається

class String
  def capitalize_first
    # ...
  end
end

і цікаво, куди має йти файл? (який каталог та ім'я файлу та чи потрібен будь-який код для ініціалізації?) Це для проекту Rails 3.0.6.

Відповіді:


140

Я завжди додаю core_extкаталог у свій libкаталог.

Створіть ініціалізатор для завантаження власних розширень (наприклад config/initializers/core_exts.rb:). І додайте в нього наступний рядок:

Dir[File.join(Rails.root, "lib", "core_ext", "*.rb")].each {|l| require l }

і мати своє розширення, як:

lib/core_ext/string.rb

class String
  def capitalize_first
    # ...
  end
end

Цікаво ... ми повинні розширити Stringклас або просто використовувати допоміжний метод з огляду? Але тоді, якщо він є помічником, то також клопітно змусити його працювати в контролері (або моделі), і його неможливо прив’язати, якs.capitalize_first.truncate(30)
nonopolarity

14
вибачте за незнання, але не могли б ви навести приклад "конфігурації ініціалізатора" дякую
Брайан

15
Я помістив його в config / application.rb: class Application < Rails::Application ... config.autoload_paths += Dir[File.join(Rails.root, "lib", "core_ext", "*.rb")].each {|l| require l } ...
d3vkit

5
Якщо ви розміщуєте розширення всередині lib/core_ext/string.rb, не забудьте включити require 'core_ext/string'у верхній частині файлу, де ви його використовуєте.
Rok Strniša

1
@moondaisy ти помиляєшся. libкаталог не повинен бути всередині appкаталогу.
Фабріціо Бертогліо

66

Ви можете зробити це в config / initializers / string.rb

class String
  def capitalize_first
    # ...
  end
end

має бути все, що вам потрібно (крім перезапуску програми).


1
Мені цікаво, куди б ви додали тестовий файл для цього розширення?
коняк

3
Найпростіший метод, так. Але ви втрачаєте підтримку для перезавантаження цього класу, коли вносите зміни в розробку.
Джош

5

Рекомендації в Rails 3.1 - це шлях:

http://guides.rubyonrails.org/plugins.html#extending-core-classes

Якщо ви дотримуєтесь стандартних умов, вам не потрібно буде возитися з конфігурацією ініціалізатора.


1
Цей метод не охоче завантажує розширення. Він завантажує його після того, як ви зателефонуєте до імені модуля / класу (у цьому посібнику Rails це Yaffle). Це означає, що ви не зможете викликати метод розширення, доки ім’я модуля (Yaffle) не буде викликано першим, і ви не зможете визначити це ім’я модуля в ініціалізаторах. Я перевірив це в консолі, і це те, як працює autoload_paths. Потрібні файли розширень у config / Initializers / або в config / application.rb - найкращі варіанти.
коняк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.