2011-11-22 22 views
28

Se ho un metodo in un controller diverso da quello in cui sto scrivendo, e voglio chiamare quel metodo, è possibile, o dovrei considerare di spostare quel metodo in un altro aiutante?Chiamare un metodo da un altro controller

+1

È possibile aggiungere fatti al problema che si desidera risolvere chiamando il metodo di un altro controller? Attualmente è piuttosto vago e la soluzione dipenderà dal problema. – mliebelt

+0

Infatti, per favore, elabora quello che stai cercando di risolvere. cosa sta facendo il metodo condiviso? – nathanvda

risposta

45

È possibile creare tecnicamente un'istanza dell'altro controller e chiamare metodi, ma è noioso, soggetto a errori e altamente sconsigliato.

Se questa funzione è comune a entrambi i controller, è probabile che sia disponibile in ApplicationController o in un altro controller della superclasse della creazione.

class ApplicationController < ActionController::Base 
    def common_to_all_controllers 
    # some code 
    end 
end 

class SuperController < ApplicationController 
    def common_to_some_controllers 
    # some other code 
    end 
end 

class MyController < SuperController 
    # has access to common_to_all_controllers and common_to_some_controllers 
end 

class MyOtherController < ApplicationController 
    # has access to common_to_all_controllers only 
end 

Un altro modo per farlo come jimworm suggerito, è quello di utilizzare un modulo per la funzionalità comune.

# lib/common_stuff.rb 
module CommonStuff 
    def common_thing 
    # code 
    end 
end 

# app/controllers/my_controller.rb 
require 'common_stuff' 
class MyController < ApplicationController 
    include CommonStuff 
    # has access to common_thing 
end 
+5

O incluso da un 'modulo'. – jimworm

+0

'include GoodSuggestion' Grazie @jimworm – edgerunner

+1

Creazione di un'istanza dell'altro controller ???? Arrrrrrrgggh (infatti). Un'altra opzione, poiché la domanda è così vaga: spostare il codice sui modelli. – nathanvda

2

Prova e progressivamente si sposta metodi ai modelli, se non si applicano ad un modello poi un aiutante e se ha ancora bisogno di essere accessibile mettere altrove nel ApplicationController

+1

Non sposterei mai il codice da un controller ad un helper, piuttosto un modulo che vive in '/ lib'. Solo il codice di visualizzazione dovrebbe vivere in un helper. – nathanvda

+1

mettere qualcosa in un aiutante è solo di breve durata. arriverete al punto in cui non dovrete mettere una lib/buttare tutto in un modulo non è neanche troppo buono. –

+1

Preferisco usare i moduli sugli helper, perché sono veri OO, posso includerli/estenderli a piacimento. Posso raggruppare cose che hanno un significato reale. Gli aiutanti sono solo secchi. Raccomando di usare solo quelli per i metodi relativi alla vista. Non sei sicuro di cosa intendi con "arriveresti al punto ...". – nathanvda

0

Se requisito ha a che fare con alcune operazioni di DB, allora si può scrivere una funzione comune (metodo di classe) all'interno di quel modello. Le funzioni definite all'interno del modello sono accessibili a tutti i controller. Ma questa soluzione si applica a tutti i casi.

Problemi correlati