2010-04-28 2 views
19

Ho diversi metodi che chiamo dai miei controller che sentono come dovrebbero essere estratti e inseriti in una classe riutilizzabile, al di fuori del controller. Dove la gente di solito mette questa roba? So che posso inserirli nel mio ApplicationController, ma non sembra un'ottima soluzione se penso di poter utilizzare questi metodi più tardi in altre applicazioni.Dove mettere i metodi riutilizzabili per l'accesso dai controller nei binari

Inoltre, ho un sacco di metodi di utilità nei miei controller che probabilmente non verranno utilizzati in altri controller, o in futuro, ma mi sento come se stessero solo gonfiando un po 'il controller. Le persone di solito le spostano da qualche parte per la pulizia o finiscono con un controller enorme?

Vengo da Java e Actionscript dove creerei solo nuove classi di utilit per questa roba.

risposta

12

La directory lib è un luogo in cui è possibile inserire moduli/classi che possono essere combinati o utilizzati dai controller (e da qualsiasi altra cosa, in realtà). Questo può essere un posto dove inserire il codice che non rientra in altre aree (ma attenzione a fare in modo che la lib non si trasformi in un disastro). commenti indesiderati, solo da tenere a mente:

  • Se sai di avere una grande quantità di funzionalità correlate che potrebbero, o sarà, essere utilizzato in altre applicazioni, che potrebbero essere un plugin.

  • Vale anche la pena ricordare che non c'è niente di sbagliato nella creazione di un modello che non sia un oggetto Active Record. Quindi, di nuovo, a seconda di quello che hai, questo potrebbe avere un senso.

+0

due punti aggiuntivi di Pete sono molto buone. Sono dell'opinione che 'lib' è per la logica della" libreria generica ", non della logica del dominio. Pertanto, se si dispone di una logica specifica per questa applicazione, ma comune a più controller, la posizione corretta potrebbe essere semplicemente in un modulo separato nella directory 'app/controller '. –

8

Creare un file di modulo nella lib directory:

module ControllerUtil 
    def foo 
    end 

    def bar 
    end 
end 

includere il modulo nel controller:

class UsersController < ApplicationController 
    include ControllerUtil 
end 
1

controller dovrebbe essere molto minimale - in pratica l'ingestione di argomenti e facendo alcuni molto alta decisioni di livello. Se hai alcune funzioni di aiuto che fanno solo questo tipo di cose ma non verranno riutilizzate, tenerle nel controller è la cosa giusta da fare. Assicurati di contrassegnarli come privati.

Per le cose più comunemente condivise, è possibile eseguirne il backup in ApplicationController (se sono utilizzate in tutti i controller) o in una classe nella directory app/modelli. Raccomando la directory dei modelli su lib perché Rails in modalità sviluppo è molto meglio per individuare le modifiche a quei file e ricaricarli. Le modifiche ai file in/lib tendono a richiedere il riavvio del server web, il che rallenta lo sforzo di sviluppo. Questo è un peccato, perché gli helper del controller non dovrebbero essere mischiati con i modelli.

In generale, tuttavia, se si dispone di più di una manciata di questi helper, probabilmente si sta facendo troppo nei controller. Dai un'occhiata a loro e vedi se forse alcuni di loro non dovrebbero far parte dei tuoi modelli.

11

È possibile creare app/modules directory, e creare il modulo XYZUtils in esso per esempio

module XYZUtils 
    def abc 
    end 

    def efg 
    end 
end 

e includere il modulo, come e quando richiesto o controller modelli etc.

include XYZUtils 

È possibile creare moduli diversi per funzioni di utilità relative a modelli diversi o entità

io non preferisco /lib directory perché questo dovrebbe contenere il codice relativo progetto, non APP correlate, ad esempio, le attività ecc

vorrei mantenere tutto il codice App relativi a /app directory stessa

+1

Chiunque gradisca questa risposta dovrebbe anche vedere la risposta di @ edebill per ulteriori buoni motivi per non mettere tale codice in/lib – rmcsharry

1

correlati alla risposta di cui sopra di Sahil Kalra dal 2014:

Rails ora ha una directory app/controllers/concerns in cui è possibile inserire moduli pieni di metodi di supporto e includerli facilmente o estenderli nei controller. Ho appena copiato e incollato tutti i miei metodi ad uso intensivo della logica dal mio application_controller e hanno funzionato immediatamente.

(si dovrebbe, ovviamente, ancora assicurarsi che tutto funzioni correttamente prima di mettere qualcosa in produzione.)