2013-07-23 11 views
5

Jak dodać pomocników routingu do tras, takich jak "ścieżka_korzeniowa" do klasy takiej jak my_model.rb jako metody klasy klasy?Dodawanie pomocników do routingu do klasy jako metod klasowych

Więc moja klasa jest tak:

Class MyModel 

    def self.foo 
    return self.root_path 
    end 

end 

MyModel.foo 

Powyższe nie działa, ponieważ klasa MyModel nie reaguje na root_path

To jest to, co wiem:

  1. I można użyć to Rails.application.routes.url_helpers, ale to tylko dodać metody modułu jako metody instancji
  2. Próbowałem robić przedłużyć Rails.application.routes.url_helpers ale nie działa

Prosimy o szkole mnie :)

+0

To jest złe podejście do MVC. Powinieneś dodać metody związane z trasami na poziomie kontrolera aplikacji lub poziomu pomocnika. –

+0

Duplikat http://stackoverflow.com/questions/341143/can-rails-routing-helpers-i-e-mymodel-pathmodel-be-used-in-models –

+0

jak to jest duplikat. dodają go jako metody instancji. Chcę dodać go jako metody klasy. i to są moje pytania: jak dodać metody instancji modułów jako metody klasowe – user566245

Odpowiedz

12

trasy URL nie powinny zasadniczo muszą być dostępne od modelu. Zwykle powinieneś mieć do nich dostęp tylko ze swojego kontrolera podczas obsługi żądania lub podczas renderowania widoku (jeśli np. Formatujesz URL linku).

Zamiast pytać obiektu modelu o ścieżkę główną, wystarczy wywołać root_path z poziomu kontrolera lub widoku.

Edit

Jeśli jesteś po prostu zainteresowany powód dlaczego nie jesteś w stanie to metody modułu jako metody klasy w swojej klasie, nie spodziewałbym prosty include do pracy, ponieważ, które uwzględnij metody modułu jako metody w twojej klasie.

extend normalnie by działało, ale w tym przypadku nie wynika to z implementacji metody url_helpers. Od actionpack/lib/action_dispatch/routing/route_set.rb źródła

def url_helpers 
    @url_helpers ||= begin 
    routes = self 

    helpers = Module.new do 
... 
     included do 
     routes.install_helpers(self) 
     singleton_class.send(:redefine_method, :_routes) { routes } 
     end 

Blok included zawierające wezwanie routes.install_helpers(self) oznacza, że ​​trzeba będzie include modułu w celu poznania metod instalowania (tak extend jest obecnie).

Następujące powinny działać, jeśli wywołasz extend w kontekście klasy. Wypróbuj to:

Class MyModel 
    class << self 
    include Rails.application.routes.url_helpers 
    end 
end 
Class.root_path 
+0

dobrze rozumiem twój punkt, ale to nie jest moje pytanie. Pytam, jak dodać metody instancji modułu jako metody klasy. Wiem, że przedłużanie powinno działać, ale nie działa w przypadku, o którym wspomniałem. Wiesz dlaczego? – user566245

+0

@ user566245 Gotcha. Zaktualizowałem moją odpowiedź, proszę spojrzeć jeszcze raz. –

+0

@ user566245 Czy to działa? Proszę spróbować i przegłosuj/zaakceptuj odpowiedź, jeśli się uda, dzięki! –