# Chiamare un metodo da un altro controller

**URL:** <https://www.ruby-forum.com/t/chiamare-un-metodo-da-un-altro-controller/174076>\
**Category:** IT\
**Created:** [August 20, 2009, 2:25pm UTC](https://www.ruby-forum.com/t/chiamare-un-metodo-da-un-altro-controller/174076 "2009-08-20T14:25:08Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![nicola55](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/5fc32e/32.png) [@nicola55](https://www.ruby-forum.com/u/nicola55)\
**Post date:** [August 20, 2009, 2:25pm UTC](https://www.ruby-forum.com/t/chiamare-un-metodo-da-un-altro-controller/174076/1 "2009-08-20T14:25:08Z")

</div>

Saluti a tutti, ho cominciato da poco con rails e molte cose sono ancora  
poco chiare. Mi chiedevo se era possibile chiamare un metodo  
“nome\_metodo” in un controller B da un controller A: eseguendo alcune  
ricerche ho trovato 2 soluzioni:

- dichiarare il metodo nomeMetodo nel controller B e dichiararlo come  
helper in application.rb
- fare tutto quanto in application.rb (dichiararlo e renderlo helper)

Per esempio, Ã¨ possibile fare cosÃ¬?

controller A \< ApplicationController  
def metodoA  
[…]  
@risultato = B.nomeMetodo  
[…]  
end  
end

Vorrei definitivamente dare una risposta completa a questo mio dubbio  
con ogni possibilitÃ . Grazie in anticipo a tutti, saluti

nicola

---

<div class="post-metadata">

**Author:** ![nicola55](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/5fc32e/32.png) [@nicola55](https://www.ruby-forum.com/u/nicola55)\
**Post date:** [August 20, 2009, 2:55pm UTC](https://www.ruby-forum.com/t/chiamare-un-metodo-da-un-altro-controller/174076/2 "2009-08-20T14:55:44Z")

</div>

Il giorno 20 agosto 2009 14.25, Nicola N.[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha  
scritto:

> Saluti a tutti, ho cominciato da poco con rails e molte cose sono ancora  
> poco chiare. Mi chiedevo se era possibile chiamare un metodo  
> “nome\_metodo” in un controller B da un controller A

in linea di massima i metodi dei controller sono fatti per essere  
invocati da rails, o come action, cioè in risposta a una request, o  
come filtri (before, after etc.).

se B.nome\_metodo è un’action di B, potresti ad esempio fare un  
redirect. è improbabile che il comportamento giusto sia restituire da  
A lo stesso output di B.nome\_metodo, perché in teoria A e B  
rappresentano due risorse diverse.

se invece B.nome\_metodo è un metodo di utilità, cioè fa una certa  
operazione che ti è necessario richiamare in più posti, allora non  
dovrebbe essere un metodo di B, ma di qualche altra classe. per  
decidere quale, dovrei saperne di più: se è un’operazione sui dati è  
probabile che vada dichiarato dentro un model; altrimenti, forse  
dovresti creare un modulo da qualche parte.

dicci di  
più.

pietro

---

<div class="post-metadata">

**Author:** ![nicola55](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/5fc32e/32.png) [@nicola55](https://www.ruby-forum.com/u/nicola55)\
**Post date:** [August 20, 2009, 2:55pm UTC](https://www.ruby-forum.com/t/chiamare-un-metodo-da-un-altro-controller/174076/3 "2009-08-20T14:55:45Z")

</div>

Ti consiglio di dichiararli in ApplicationController, in modo da  
sfruttare  
l’ereditarietà per rendere disponibili i tuoi metodi in tutti i  
controller.  
Il segno di minore “\<” indica questo tipo di relazione tra quella classe  
e  
ControllerA.  
Nel caso il numero di metodi dovesse proliferare ti consiglio di creare  
un  
modulo apposito in lib/ e di includerlo.

Perché ti serve dichiarare i metodi come helper? Questa macro serve a  
rendere disponibile un metodo tra controller e view, non tra diversi  
controller.

Luca

---

<div class="post-metadata">

**Author:** ![nicola55](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/5fc32e/32.png) [@nicola55](https://www.ruby-forum.com/u/nicola55)\
**Post date:** [August 20, 2009, 6:16pm UTC](https://www.ruby-forum.com/t/chiamare-un-metodo-da-un-altro-controller/174076/4 "2009-08-20T18:16:16Z")

</div>

Vi ringrazio per le risposte, vedo che c’Ã¨ molto piÃ¹ da tirare in ballo.  
Scarto il metodo helper, ne basterebbe uno protected nella sopraclasse  
quindi.

Per spiegare il tutto parto un po’ da lontano: il controller B Ã¨ un  
SessionsController. Quando un utente vuole effettuare il login, va nella  
pagina /sessions/new: qui inserisce i dati, che passano al metodo  
create, il quale li prende dal POST, se non ho capito male, li legge e  
crea una nuova sessione per l’utente.

Fin qui tutto ok

Il controller A Ã¨ uno UsersController che gestisce gli utenti  
registrati. In particolare consente di recuperare una  
password smarrita: se uno vuole recuperarla, seguendo il link su una  
mail, vorrei che effettuasse il login in automatico (un’azione in  
UsersController) e venisse rediretto a edit di Users.

Il pallino mi Ã¨ venuto quando pensavo a come creare una sessione da  
UsersController, senza fare del lavoro che dovrebbe essere fatto da  
SessionsController e senza spostare il tutto nella sopraclasse per  
mantenere le cose separate.

Leggendo le vostre risposte mi viene in mente di mettere un link ad  
un’azione in SessionsController nella mail, che fa un redirect ad  
un’azione di UsersController (edit). Avete altre idee?

Vi ringrazio per l’attenzione ed il tempo,

Nicola

---

<div class="post-metadata">

**Author:** ![nicola55](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/5fc32e/32.png) [@nicola55](https://www.ruby-forum.com/u/nicola55)\
**Post date:** [August 20, 2009, 3:03pm UTC](https://www.ruby-forum.com/t/chiamare-un-metodo-da-un-altro-controller/174076/5 "2009-08-20T15:03:21Z")

</div>

Ciao Nicola,  
come avrai notato non è facilmente attuabile una soluzione  
poiché,concettualmente, quello che stai cercando di fare va contro la corretta  
progettazione di una struttura MVC.

Potresti chiarire meglio cosa vuoi fare ed il motivo di questa esigenza?  
Senz’altro c’è una soluzione più efficace.

– Simone

2009/8/20 Nicola N. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> controller A \< ApplicationController
> 
> ## nicola
> 
> Posted via [http://www.ruby-forum.com/](http://www.ruby-forum.com/).
> 
> * * *
> 
> Ml mailing list  
> removed\_email\_address@domain.invalid  
> [http://lists.ruby-it.org/mailman/listinfo/ml](http://lists.ruby-it.org/mailman/listinfo/ml)

–  
Simone C.

Site & Blog: [http://www.simonecarletti.com](http://www.simonecarletti.com)  
Email: removed\_email\_address@domain.invalid  
LinkedIn: [http://linkedin.com/in/weppos](http://linkedin.com/in/weppos)  
Nick: weppos | Skype: weppos

---

<div class="post-metadata">

**Author:** ![nicola55](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/5fc32e/32.png) [@nicola55](https://www.ruby-forum.com/u/nicola55)\
**Post date:** [August 20, 2009, 11:28pm UTC](https://www.ruby-forum.com/t/chiamare-un-metodo-da-un-altro-controller/174076/6 "2009-08-20T23:28:03Z")

</div>

Fammi capire se ho afferrato abbastanza: tu dici di creare un modello  
che gestisca le sessioni senza doverlo associare ad una tabella nel  
database (quindi se non ho capito male gli ActiveRecord sono quelli con  
db associato) cosÃ¬ da poterlo usare da dove voglio.

Fin’ora consideravo il modello strettamente associato alle tabelle,  
quindi solo quando ne avevo una creavo il modello associato, e questo mi  
vincolava. Mi fa piacere che non sia cosÃ¬, mi sembrava troppo limitato  
in quel modo…

Vi ringrazio per avermi indirizzato con le vostre domande e consigli,  
specialmente quest’ultima risposta, che anche se non risolve il problema  
(penso di sÃ¬) mi ha fatto capire altre cose piÃ¹ importanti.

Nicola

---

<div class="post-metadata">

**Author:** ![nicola55](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/5fc32e/32.png) [@nicola55](https://www.ruby-forum.com/u/nicola55)\
**Post date:** [August 20, 2009, 6:33pm UTC](https://www.ruby-forum.com/t/chiamare-un-metodo-da-un-altro-controller/174076/7 "2009-08-20T18:33:31Z")

</div>

Il giorno 20 agosto 2009 18.16, Nicola N.[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha  
scritto:

> Leggendo le vostre risposte mi viene in mente di mettere un link ad  
> un’azione in SessionsController nella mail, che fa un redirect ad  
> un’azione di UsersController (edit). Avete altre idee?

credo di aver capito il problema. una soluzione consiste nello  
spostare gran parte della logica per la creazione di una sessione da  
SessionsController a un model, ad esempio Session (che sia basato su  
ActiveRecord o no non ha importanza).

l’idea sarebbe:

# controllers/sessions\_controller.rb

class SessionsController \< ApplicationController  
…

def create  
… # eventuali controlli vari  
session = Session.new params[:session]  
… # altro  
end  
…  
end

# controllers/users\_controller.rb

class UsersController \< ApplicationController  
…

def un\_action\_che\_vuole\_creare\_una\_session  
…  
session = Session.new dativari  
…  
end  
…  
end

# models/session.rb

class Session  
def initialize datinecessari  
… # qui avviene quello che deve avvenire  
end  
end

in generale è preferibile spostare quanta più logica possibile dal  
controller al (ai) model.

alcuni esempi (che per me sono stati) illuminanti:

> **[\#119 Session Based Model - RailsCasts](http://railscasts.com/episodes/119-session-based-model)**
>
> Short Ruby on Rails screencasts containing tips, tricks and tutorials. Great for both novice and experienced web developers.

> **[\#121 Non Active Record Model - RailsCasts](http://railscasts.com/episodes/121-non-active-record-model)**
>
> Short Ruby on Rails screencasts containing tips, tricks and tutorials. Great for both novice and experienced web developers.

pietro
