Wo sollte der Code in Ruby on Rails eingefügt werden, um die String-Klasse zu erweitern?

79

Wenn ich auf Ruby on Rails bin, muss ich eine Methode namens hinzufügen

class String
  def capitalize_first
    # ...
  end
end

und fragen Sie sich, wohin die Datei gehen soll? (Welches Verzeichnis und welcher Dateiname sowie welcher Initialisierungscode werden benötigt?) Dies gilt für ein Rails 3.0.6-Projekt.

Unpolarität
quelle

Antworten:

140

Ich füge immer ein core_extVerzeichnis in mein Verzeichnis ein lib.

Erstellen Sie einen Initialisierer zum Laden der benutzerdefinierten Erweiterungen (zum Beispiel :) config/initializers/core_exts.rb. Und fügen Sie die folgende Zeile hinzu:

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

und haben Sie Ihre Erweiterung wie:

lib/core_ext/string.rb

class String
  def capitalize_first
    # ...
  end
end
Mike Lewis
quelle
Ich frage mich ... sollten wir die StringKlasse erweitern oder nur eine Hilfsmethode verwenden? Aber dann, wenn es ein Helfer ist, dann ist es auch mühsam, es in Controller (oder Modell) arbeiten zu lassen, und es kann nicht wie verkettet werdens.capitalize_first.truncate(30)
Unpolarität
14
Verzeihen Sie meine Unwissenheit, aber könnten Sie ein Beispiel für eine "Initialisierer-Konfiguration" geben, danke
Brian
15
Ich habe es in config / application.rb platziert: class Application < Rails::Application ... config.autoload_paths += Dir[File.join(Rails.root, "lib", "core_ext", "*.rb")].each {|l| require l } ...
d3vkit
5
Wenn Sie die Erweiterung in die Datei lib/core_ext/string.rbeinfügen, vergessen Sie nicht, sie require 'core_ext/string'oben in die Datei aufzunehmen, in der Sie sie verwenden.
Rok Strniša
1
@moondaisy du liegst falsch. libDas Verzeichnis sollte sich nicht im appVerzeichnis befinden.
Fabrizio Bertoglio
66

Sie können dies in config / initializers / string.rb tun

class String
  def capitalize_first
    # ...
  end
end

sollte alles sein, was Sie brauchen (außer einem App-Neustart).

njorden
quelle
1
Ich bin gespannt, wo Sie eine Testdatei für diese Erweiterung hinzufügen würden.
Konyak
3
Einfachste Methode, ja. Sie verlieren jedoch die Unterstützung für das Neuladen dieser Klasse, wenn Sie Änderungen in der Entwicklung vornehmen.
Josh
5

Die Richtlinien in Rails 3.1 sind der richtige Weg:

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

Wenn Sie die Standardkonvention befolgen, müssen Sie sich nicht mit einer Initialisierungskonfiguration herumschlagen.

Hopstream
quelle
16
... für Plugins
Brittohalloran
1
Diese Methode lädt die Erweiterung nicht unbedingt. Es wird geladen, nachdem Sie den Modul- / Klassennamen aufgerufen haben (in diesem Rails-Handbuch ist es Yaffle). Dies bedeutet, dass Sie die Erweiterungsmethode erst aufrufen können, wenn der Modulname (Yaffle) zuerst aufgerufen wird und Sie diesen Modulnamen nicht in Initialisierern definieren können. Ich habe es in der Konsole getestet und so funktioniert autoload_paths. Das Erfordernis der Erweiterungsdatei in config / initializers / oder in config / application.rb sind die besten Optionen.
Konyak