2011-11-22 48 views
28

Si tengo un método en un controlador diferente al que estoy escribiendo, y quiero llamar a ese método, ¿es posible, o debería considerar mover ese método a un ¿ayudante?Llamar a un método de otro controlador

+1

¿Podría agregar hechos al problema que desea resolver llamando al método de otro controlador? Actualmente es bastante vago, y la solución dependerá del problema. – mliebelt

+0

De hecho, elabore lo que está tratando de resolver. ¿Qué está haciendo el método compartido? – nathanvda

Respuesta

45

Podría técnicamente crear una instancia del otro controlador y llamar a métodos sobre eso, pero es tedioso, propenso a errores y altamente no recomendado.

Si esa función es común para ambos controladores, probablemente debería tenerla en ApplicationController u otro controlador de superclase de su creación.

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 

Sin embargo, otra manera de hacerlo como jimworm sugirió, es utilizar un módulo para la funcionalidad común.

# 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 incluido en un 'módulo'. – jimworm

+0

'include GoodSuggestion' Gracias @jimworm – edgerunner

+1

¿Creando una instancia del otro controlador ???? Arrrrrrrgggh (de hecho). Otra opción, ya que la pregunta es muy vaga: mueva el código a los modelos. – nathanvda

2

Try y progresivamente se mueven métodos para sus modelos, si no se aplican a un modelo continuación, un ayudante y si todavía se necesita acceder poner en otro lugar en el ApplicationController

+1

Nunca movería el código de un controlador a un ayudante, sino un módulo que vive en '/ lib'. Solo el código de vista debería vivir en un helper. – nathanvda

+1

poner algo en un ayudante es de corta duración. Llegarás al punto donde no tienes que poner una lib/tirar todo en un módulo tampoco es demasiado bueno. –

+1

Prefiero usar módulos sobre ayudantes, porque son verdaderos OO, puedo incluirlos/extenderlos a voluntad. Puedo agrupar cosas que tienen un significado real. Los ayudantes son solo cubos. Recomiendo usar solo aquellos para los métodos relacionados con la vista. No estoy seguro de lo que quiere decir con 'llegarás al punto ...'. – nathanvda

0

Si usted requisito tiene que ver con algunas operaciones de base de datos, entonces se puede escribir una función común (método de clase) dentro de ese modelo. Las funciones definidas dentro del modelo son accesibles para todos los controladores. Pero esta solución se aplica a todos los casos.

Cuestiones relacionadas