Wie erstelle und verwende ich ein Modul mit Ruby on Rails 3?

90

Ich verwende Ruby on Rails 3 und möchte benutzerdefinierten und gemeinsam genutzten Code in ein Modul verschieben.

  1. Welche Syntax soll ich zum Schreiben des Modulcodes verwenden?
  2. In welchem ​​Ordner meiner Anwendung muss ich die Moduldatei ablegen?
  3. Wie muss ich dieses Modul in eine oder mehrere Controller-Klassen aufnehmen?
  4. Welche andere Aktion muss ich, falls vorhanden, an einer beliebigen Stelle in meiner Anwendung verwenden?
  5. Wie kann ich Methoden im Modul aus meiner Anwendung aufrufen?

Danke im Voraus.

user502052
quelle
2
Sehr gut! Ich brauchte es.
Arup Rakshit

Antworten:

115

Zu 1. Ein Modul wird erstellt / geöffnet, indem einfach gesagt wird:

module MyModule
  def first_module_method
  end
end

Zu 2. Der libOrdner. Wenn Sie Ihre Module im libOrdner organisieren möchten , können Sie sie selbst in Module einfügen. Wenn Sie beispielsweise einen Unterordner super_modulesmöchten, werden Ihre Module wie folgt definiert:

module SuperModules
  module MyModule
    def first_module_method
    end
  end
end

Bis 3./5. Wenn Sie das Modul in eine Klasse aufnehmen, können Sie die Modulmethoden einfach so aufrufen, als wären sie in der Klasse definiert:

class MyClass
  include MyModule
  def some_method
    first_module_method #calls module method
  end
end

Stellen Sie zunächst sicher, dass Ihr Modul in jeder Klasse Ihrer Anwendung wirklich benötigt wird. Wenn dies nicht der Fall ist, ist es sinnvoll, es nur dort einzuschließen, wo es benötigt wird, um die Klassen, die es sowieso nicht benötigen, nicht aufzublähen. Wenn Sie das Modul wirklich überall haben möchten, sehen Sie sich die Klassenhierarchie Ihrer Klassen in der App an. Möchten Sie das Modul in allen Modellen? Sie können ActiveRecord :: Base öffnen und dort Ihr Modul hinzufügen.

Stephan
quelle
2
Kann ich zum Organisieren von Dateien einen Unterordner im Ordner 'lib' erstellen? Wenn ja, was ändert sich?
user502052
2
@ user502052 Ich habe die Antwort auf Punkt 2 aktualisiert, um diese Frage zu beantworten.
Stephan
3
Viele Dinge sind hier unklar. Welche Dateinamen geben? Wie rufe ich die Methoden auf, wenn nicht das gesamte Modul enthalten ist? Ich kann nicht glauben, dass es so viele Upvotes gibt, da ich am Ende immer noch nicht weiß, wie man ein Modul benutzt.
Augustin Riedinger
5
Sobald Sie , indem es in dem ein Modul , wie oben erstellen libOrdner, ein wichtiger Hinweis ist Rails3 zu ermöglichen , in die Zeile Kommentar- config\application.rbfür config.autoload_paths- lesen zB stackoverflow.com/questions/1073076/rails-lib-modules-and ... Hinweis Außerdem müssen Sie darauf achten, einen Dateinamen für Ihr Modul zu verwenden, der mit dem Modulnamen selbst übereinstimmt. Wenn Sie es also speichern lib/test/my_module.rb, müssen Sie include Test::MyModule- für weitere Details siehe stackoverflow.com/questions/4073856/rails-3-autoload
sameers
6
Ich habe gerade meine alte Antwort gefunden. :( Ich möchte abstimmen. Setzen Sie nichts in die Bibliothek! Fügen Sie Ihren Code (einschließlich zusätzlicher Module) ein, app/modelswenn der Code Zugriff auf andere Modelle benötigt. Wenn Ihr Code wirklich eine 'Bibliothek' ist und für sich allein existieren kann, ich Schlagen Sie vor, einen Edelstein zu verkaufen. Beispiele finden Sie unter github.com/shageman/the_next_big_thing
Stephan
3

A> 1. Sie können dieselbe Syntax wie jede andere Ruby-Klasse verwenden. Zum Beispiel definiere ich ein VehicleClassifer-Modul, das die classify_vehicle-Methode verwendet, um ein Fahrzeug basierend auf der Anzahl der Räder zu klassifizieren, die es als Eingabe empfängt.

module VehicleClassifer
  def classify_vehicle(number_of_wheels)
    VehicleType.where("number_of_wheels = ?", number_of_wheels)
  end
end

A> 2. Module werden normalerweise im Ordner / lib gespeichert.

Fragen 3,4,5 haben mehr oder weniger die gleiche Antwort. Sie können verwenden

class SomeController < ApplicationController
  include VehicleClassfier

  def index 
    classify_vehicle(4)  
  end
end

In der Klasse verwenden Sie das Modul und haben Zugriff auf alle Methoden des Moduls.

Falls Sie ein Modul in Ihrer gesamten App verwenden müssen, können Sie es in Ihren Anwendungscontroller aufnehmen.

Shreyas
quelle
2
Ich habe es versucht und einen undefinierten Methodenfehler erhalten. Irgendeine Idee, was ich falsch mache?
Tony
Sind Sie sicher, dass Ihr Modul zugänglich ist? stackoverflow.com/questions/6604272/… hilft Ihnen vielleicht?
Shreyas
1
@Tony - Möglicherweise müssen Sie Ihren Server neu starten - auch im Dev-Modus, damit die Methoden des Moduls verfügbar sind. Und jedes Mal, wenn Sie den Code in Ihrem Modul ändern, müssen Sie den Server erneut starten. Zum Beispiel, wenn ein Fehler oder ein Fehler im alten Code auftritt, aber markieren Sie den neuen Code in dieser Zeile in der Fehlermeldung - sehr verwirrend.
JosephK
Haben Sie eine Idee, wie Sie diese benutzerdefinierten Module einbinden und verwenden können ApplicationHelper?
WM