2011-09-25 12 views
8

Estoy usando la gema bitly y me gustaría tener acceso a la API bitly dentro de mis métodos de ayuda (a los que las vistas y los publicitarios llaman para generar URL).Rails: método de controlador o variable de instancia dentro de un helper

que iniciar una conexión API en este método en mi ApplicationController:

(¿hay un lugar más apropiado para hacer esto cierto?)

class ApplicationController < ActionController::Base 
    before_filter :bitly_connect 

    def bitly_connect 
    Bitly.use_api_version_3 
    @bitly ||= Bitly.new(APP_CONFIG['bitly_username'], APP_CONFIG['bitly_api_key']) 
    end 
end 

Por defecto que no tienen acceso a @bitly en mis ayudantes ¿Puedes sugerir una manera de lograr eso?

El único hilo relacionado encontré no era útil: Rails 3 and Controller Instance Variables Inside a Helper

Gracias.

Respuesta

9

Rails por convención pasa variables de instancia establecidas en las acciones del controlador (y filtros) a lo largo de las vistas. Los métodos auxiliares están disponibles en estas vistas y deben tener acceso a las variables de instancia que establezca dentro de su acción de controlador.

Alternativamente, se puede establecer una variable local dentro de su método de ayuda al pasar la variable al método, o utilizando el método objeto # instance_variable_get: http://ruby-doc.org/core/classes/Object.html#M001028

# app/controllers/example_controller.rb 
class ExampleController 
    def index 
    @instance_variable = 'foo' 
    end 
end 

# app/helpers/example_helper.rb 
module ExampleHelper 
    def foo 
    # instance variables set in the controller actions can be accessed here 
    @instance_variable # => 'foo' 
    # alternately using instance_variable_get 
    variable = instance_variable_get(:@instance_variable) 
    variable # => 'foo' 
    end 
end 

En cuanto a sus preocupaciones con la colocación de la lógica, no parece que pertenezca al controlador. Piense en el controlador como solicitudes de enrutamiento para su aplicación. La mayoría de la lógica debe realizarse dentro de las clases de su modelo. "Controlador flaco, modelo de grasa.": http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model

2

Si necesita un método de control para que sea accesible como un ayudante, puede utilizar helper_method

class ApplicationController < ActionController::Base 
    helper_method :bitly_connect 

    def bitly_connect 
    @bitly ||= begin 
     Bitly.use_api_version_3 
     Bitly.new(APP_CONFIG['bitly_username'], APP_CONFIG['bitly_api_key']) 
    end 
    end 
end 

Nota que también alteró el método, por lo que doesn No llame al Bitly.use_api_version_3 cada vez que se llame.

Como notó Ben Simpson, probablemente deberías cambiar esto a un Modelo.

Cuestiones relacionadas