2012-06-15 17 views
6

Soy nuevo en Rails y trato de configurar un archivo de módulo para usarlo en la vista. Así que creo que el comportamiento correcto es definir el módulo como un ayudante dentro de un controlador y listo, debería estar funcionando. Sin embargo, ese no es el caso para mí. Aquí está la estructura.Rieles: incluye el módulo en el controlador, para usar en la vista

lib 
    functions 
    -- form_manager.rb 

form_manager.rb:

Module Functions 
    Module FormManager 
    def error_message() ... 
    end 
    end 
end 

users_controller.rb

class UsersController < ApplicationController 

    helper FormManager 

    def new ... 

Bueno, la estructura es igual que el anterior y cuando llamo al mensaje_error de new.html.erb me da el error: uninitialized constant UsersController::FormManager.

Entonces, antes que nada, sé que en rails 3 lib no se carga automáticamente. Suponiendo que no es obligatorio cargar automáticamente la carpeta lib, ¿cómo puedo hacer que funcione y qué me falta?

Por cierto, no digas que esta pregunta está duplicada. Te digo que he estado buscando esta mierda por casi 2 días.

Respuesta

14

Su módulo no se carga automáticamente (al menos no en 3.2.6). Tienes que cargarlo explícitamente. Esto se puede conseguir con la siguiente línea de código

# in application.rb 
config.autoload_paths += %W(#{config.root}/lib) 

Puede revisar sus trayectorias de carga automática con Rails.application.config.autoload_paths. ¿Tal vez está definido para ti?

Ahora está seguro de su módulo se carga, se puede comprobar en rails console llamando

> Functions::FormHelper 

Ahora no puede utilizar ese módulo como un ayudante de vista por defecto. Use #included para definir el ayudante cuando se incluye su módulo. Usted logra una "evaluación perezosa" de esta manera. Creo que el problema con su código es que se llama al método helper antes de que se incluya el módulo. (Alguien me debe corregir si me equivoco)

Aquí está el código:

Module Functions 
    Module FormManager 
    def error_message() ... 
    end 

    def self.included m 
     return unless m < ActionController::Base 
     m.helper_method :error_message 
    end 

    end 
end 

También debe eliminar la línea helper de su controlador.

EDIT:

Usted puede lograr esto sin carga automática. Simplemente use require "functions/form_manager". Usted define un helper_method para cada método. Si desea utilizar todos los métodos de módulos como ayudantes utilizan

def self.included m 
    return unless m < ActionController::Base 
    m.helper_method self.instance_methods 
end 

Edit2:

Parece que no es necesario utilizar self.included.Esto logra la misma funcionalidad:

class ApplicationController < ActionController::Base 

    include Functions::FormManager 
    helper_method Functions::FormManager.instance_methods 

end 
+1

Esto ha funcionado, ¡muchas gracias! :) Sin embargo, si elimino el helper no funciona, mejor déjalo como está :) Por cierto, ¿no hay otro método que no sea la carga automática? Porque creo que cuando se carga automáticamente, incluso si no está utilizando el módulo, se cargará de todos modos. Y una segunda pregunta: ¿debería enumerar todos los métodos en el módulo como lo hizo en el método incluido? (Quiero decir, como m.helper_method: create_form, m.helper_method: destroy_form etc ...) –

+0

Hm, no funciona sin 'helper'? Extraño. Actualizó la publicación con las respuestas. Deberías haber hecho la pregunta antes, lamento que hayas desperdiciado 2 días en esto :( – shime

+0

No funciona sin carga automática también. Creo que tendré que quedarme con la autocarga. ¡Gracias de nuevo! –

0

Parece que está namespacing FormManager interior de Functions que significa que tendría que llamar por helper Functions::FormManager

Trate de que

Cuestiones relacionadas