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.

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

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).


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.