2012-06-15 7 views
6

Jestem naprawdę nowy dla Railsów i próbuję skonfigurować plik modułu, który będzie używany w widoku. Uważam, że prawidłowe zachowanie jest zdefiniowanie modułu jako pomocnika w kontrolerze i voila, powinno działać. Jednak nie dotyczy to mnie. Oto struktura.Szyny - zawierają moduł do kontrolera, który ma być używany w widoku

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 ... 

Dobrze, struktura jest jak wyżej i kiedy wezwać ERROR_MESSAGE z new.html.erb daje mi błąd: uninitialized constant UsersController::FormManager.

Przede wszystkim wiem, że w szynach 3 lib nie jest ładowane automatycznie. Zakładając, że automatyczne ładowanie folderu lib nie jest obowiązkowe, jak mogę je wykonać i czego brakuje?

BTW, proszę nie mówić, że to pytanie jest duplikatem. Mówię ci, że szukałem tego bzdura przez prawie 2 dni.

Odpowiedz

14

Twój moduł nie jest ładowane automatycznie (przynajmniej nie w 3.2.6). Musisz załadować go jawnie. Można to osiągnąć za pomocą następującego wiersza kodu

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

można sprawdzić ścieżki autoLoad z Rails.application.config.autoload_paths. Może rzeczywiście jest to dla ciebie zdefiniowane?

Teraz masz pewność, że moduł jest ładowany, można sprawdzić w rails console wywołując

> Functions::FormHelper 

Teraz nie można użyć tego modułu jako pomocnika widoku domyślnie. Użyj #included, aby zdefiniować pomocnika po włączeniu modułu. W ten sposób osiągasz "leniwą ocenę". Myślę, że problem z kodem polega na tym, że metoda helper jest wywoływana przed włączeniem modułu. (Ktoś powinien mnie poprawić jeśli się mylę)

Oto kod:

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 

Należy również usunąć wiersz helper od kontrolera.

EDYTOWANIE:

Możesz to osiągnąć bez automatycznego ładowania. Po prostu użyj require "functions/form_manager". Użytkownik definiuje metodę helper_method dla każdej metody. Jeśli chcesz korzystać ze wszystkich metod modułu jako pomocnicy używać

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

EDIT2

: Wydaje

że nie trzeba używać self.included.Osiąga tę samą funkcjonalność:

class ApplicationController < ActionController::Base 

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

end 
+1

To zadziałało, wielkie dzięki! :) Jeśli jednak usunę pomocnika, to nie działa, więc lepiej zostaw to tak, jak jest :) BTW, czy nie ma innej metody oprócz autoloadingu? Ponieważ uważam, że po autoloadowaniu, nawet jeśli nie korzystasz z modułu, zostanie on załadowany. I drugie pytanie: czy powinienem wymienić każdą metodę w module, tak jak w przypadku metody włączonej? (Mam na myśli, podobnie jak m.helper_method: create_form, m.helper_method: destroy_form etc ...) –

+0

Hm, nie działa bez 'helper'? Dziwne. Zaktualizowano wpis odpowiedziami. Powinieneś był zadać to pytanie wcześniej, przykro mi, że zmarnowałeś 2 dni na to :( – shime

+0

Nie działa również bez autoload. Chyba będę musiał trzymać się autoload. Jeszcze raz dziękuję! –

0

Wydaje jesteś przestrzeni nazw FormManager wewnątrz Functions co oznacza nazwałbyś go helper Functions::FormManager

Spróbuj że

Powiązane problemy