28

In rails, posso ottenere il nome del controller corrente tramite controller_name e l'azione corrente chiamando action_name. Sto cercando analoga riflessione di runtime per il recupero di quanto segue:Come ottenere l'elenco dei controller e delle azioni in ruby ​​on rails?

  1. Elenco di tutti i controller nell'applicazione.
  2. Elenco di tutte le azioni in un determinato controller.

Ad esempio, I un controller di prodotto con azioni "aggiungi" e "modifica". Posso estrarre i nomi di queste azioni a livello di programmazione per mostrare all'utente quali operazioni sono supportate?

Ho esaminato un metodo che richiede l'uso di ActionController::Routing::Routes.named_routes.routes.each ma non ho potuto farlo funzionare. Ho ricevuto l'errore ActionDispatch::Routing::Routes costante non inizializzato quando l'ho usato.

Se c'è qualche buon tutorial o documento che può aiutarmi a capire come le capacità di riflessione delle rotaie. L'ho cercato ma per la maggior parte ho avuto blog relativi alla riflessione dei record attivi. Sto cercando qualcosa che mi permetta di ottenere informazioni su controllori e azioni/metodi in fase di esecuzione.
Grazie,

Tabrez

+0

Lo stai facendo in fase di esecuzione o in rake. il tempo di esecuzione è una cattiva idea. Il rake job è facile da fare. – drhenner

+0

Intendevi "percorsi di rastrellamento"? Stavo cercando qualcosa in fase di esecuzione. Non ho bisogno delle informazioni estese che generano le uscite dei percorsi. Ho solo bisogno dei nomi dei controller, che presumo devono essere disponibili come raccolta. Essendo un noob to rails, non so quali oggetti di contesto sono accessibili in rails in fase di runtime. – Tabrez

+0

Trovata una domanda simile qui, http://stackoverflow.com/questions/1564278/how-to-programmatically-list-all-controllers-in-rails – nkm

risposta

92

Il modo più semplice per ottenere un elenco di classi controller è:

ApplicationController.descendants 

Tuttavia, le classi vengono caricate pigramente, è necessario caricare desiderosi tutte le classi prima tu lo fai. Tenete a mente che questo metodo ci vorrà tempo, e sarà rallentare il caricamento del sistema:

Rails.application.eager_load! 

per ottenere tutte le azioni in un controller, usare action_methods

PostsController.action_methods 

Ciò restituirà un Set contenente un elenco di tutti i metodi nel controller che sono "azioni" (utilizzando la stessa logica utilizzata da Rails per decidere se un metodo è un'azione valida da indirizzare).

+0

Questo era esattamente quello che stavo cercando. Molte grazie! C'è qualche risorsa particolare/guida/libro che potrebbe aiutare a capire questo tipo di argomenti; più specificamente il ciclo di vita delle pagine e gli oggetti di runtime che attraversano le rotaie? Qualsiasi suggerimento sarà di grande aiuto in quanto io sono nuovo alle guide. – Tabrez

+1

Vale la pena ricordare questo chiamando '.action_methods' ottieni solo l'elenco di metodi pubblici (= azioni) definiti in una classe. Dal momento che Rails può eseguire il rendering del modello senza un metodo effettivo nel controller, è possibile che si crei un buco di sicurezza nell'applicazione. –

1

PostsController.action_methods restituirà tutte le azioni del PostsController compresi ereditaria, non è quello che voglio, ho trovato PostsController.instance_methods(false), che restituirà tutti i metodi di PostsController istanza e non includono ereditato, esattamente quello che voglio.

Problemi correlati