Come creare e utilizzare un modulo utilizzando Ruby on Rails 3?


90

Sto usando Ruby on Rails 3 e vorrei spostare del codice personalizzato e condiviso in un modulo.

  1. Quale sintassi dovrei usare per scrivere il codice del modulo?
  2. In quale cartella della mia applicazione devo posizionare il file del modulo?
  3. Come devo includere quel modulo in una o più classi di controller?
  4. Quale altra azione, se del caso, devo utilizzare il modulo personalizzato ovunque nella mia applicazione?
  5. Come posso chiamare i metodi nel modulo dalla mia applicazione?

Grazie in anticipo.


2
Molto bene! Mi serviva.
Arup Rakshit

Risposte:


115

Per 1. Un modulo viene creato / aperto semplicemente dicendo:

module MyModule
  def first_module_method
  end
end

Per 2. La libcartella. Se vuoi organizzare i tuoi moduli nella libcartella, puoi inserirli nei moduli stessi. Ad esempio, se volessi una sottocartella, i super_modulestuoi moduli sarebbero definiti come segue:

module SuperModules
  module MyModule
    def first_module_method
    end
  end
end

A 3./5. Quando includi il modulo in una classe puoi semplicemente chiamare i metodi dei moduli come se fossero definiti all'interno della classe:

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

Per 4. Innanzitutto, assicurati che il tuo modulo sia realmente necessario in ogni classe della tua applicazione. In caso contrario, ha senso includerlo solo dove è necessario per non gonfiare le classi che non ne hanno comunque bisogno. Se vuoi davvero il modulo ovunque, includi lo sguardo alla gerarchia delle classi delle tue classi nell'app. Vuoi il modulo in tutti i modelli? Potresti aprire ActiveRecord :: Base e aggiungere il tuo modulo lì.


2
Per organizzare i file, posso creare una sottocartella nella cartella "lib"? In caso affermativo, cosa cambia?
user502052

2
@ user502052 Ho aggiornato la risposta al punto 2 per rispondere a questa domanda.
Stephan

3
Molte cose non sono chiare qui. Quali nomi di file dare? Come chiamare i metodi quando non si include tutto il modulo? Non riesco a credere che ci siano così tanti voti positivi dato che ancora non so come usare un modulo alla fine.
Augustin Riedinger

5
Una volta creato un modulo come sopra includendolo nella libcartella, una nota importante è abilitare Rails3 a decommentare la riga in config\application.rbfor config.autoload_paths- leggi ad esempio stackoverflow.com/questions/1073076/rails-lib-modules- e ... Nota anche che devi stare attento a usare un nome di file per il tuo modulo che corrisponda al nome del modulo stesso. Quindi, se si salva in lib/test/my_module.rb, è necessario include Test::MyModule- per ulteriori dettagli vedere stackoverflow.com/questions/4073856/rails-3-autoload
sameers

6
Ho appena trovato questa mia vecchia risposta. :( Voglio downvote. Non mettere nulla in lib! Metti il ​​tuo codice (compresi i moduli aggiuntivi) app/modelsse il codice ha bisogno di accedere ad altri modelli. Se il tuo codice è veramente una "libreria" e può esistere da solo, io suggerire di vendere una gemma. Per esempi, vedere github.com/shageman/the_next_big_thing
Stephan

3

A> 1. Puoi usare la stessa sintassi di qualsiasi altra classe ruby. Ad esempio, sto definendo un modulo VehicleClassifer che utilizzerà il metodo classify_vehicle per classificare un veicolo in base al numero di ruote che riceve come input.

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

A> 2. I moduli sono generalmente archiviati nella cartella / lib.

le domande 3,4,5 hanno più o meno la stessa risposta. Puoi usare

class SomeController < ApplicationController
  include VehicleClassfier

  def index 
    classify_vehicle(4)  
  end
end

nella classe che stai utilizzando il modulo e avrai accesso a tutti i metodi del modulo.

Inoltre, nel caso in cui sia necessario utilizzare un modulo tramite l'app, è possibile includerlo nel controller dell'applicazione.


2
Ho provato questo e ho ricevuto un errore di metodo non definito. Qualche idea di cosa sto facendo di sbagliato?
Tony,

Sei sicuro che il tuo modulo sia accessibile? stackoverflow.com/questions/6604272/… forse ti aiuta?
Shreyas

1
@Tony - Potrebbe essere necessario riavviare il server, anche in modalità dev, per rendere disponibili i metodi del modulo. E ogni volta che cambi il codice nel tuo modulo, devi riavviare di nuovo il server. Ad esempio, se si verifica un errore, o si verificherà un errore sul vecchio codice, ma evidenzia il nuovo codice su quella riga nel messaggio di errore - molto confuso.
JosephK

Qualche idea su come includere e utilizzare quei moduli personalizzati all'interno ApplicationHelper?
WM
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.