Meine helper-Methoden in controller
Meine app sollte html Rendern, um zu beantworten, wenn ein Benutzer klickt auf ajax-link.
Mein controller:
def create_user
@user = User.new(params)
if @user.save
status = 'success'
link = link_to_profile(@user) #it's my custom helper in Application_Helper.rb
else
status = 'error'
link = nil
end
render :json => {:status => status, :link => link}
end
Meine Helfer:
def link_to_profile(user)
link = link_to(user.login, {:controller => "users", :action => "profile", :id => user.login}, :class => "profile-link")
return(image_tag("/images/users/profile.png") + " " + link)
end
Habe ich versucht, solche Methoden:
ApplicationController.helpers.link_to_profile(@user)
# It raises: NoMethodError (undefined method `url_for' for nil:NilClass)
und:
class Helper
include Singleton
include ActionView::Helpers::TextHelper
include ActionView::Helpers::UrlHelper
include ApplicationHelper
end
def help
Helper.instance
end
help.link_to_profile(@user)
# It also raises: NoMethodError (undefined method `url_for' for nil:NilClass)
Außerdem, ja, ich WEIß, über :helper_method, und es funktioniert, aber ich will nicht zu überlasten meine ApplicationController mit einer Menge, die Methoden
InformationsquelleAutor Vizakenjack | 2010-04-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Oki. Lassen Sie uns rekapitulieren. Sie wollen Zugang zu certaint Funktionen/Methoden, aber Sie wollen nicht die Methoden befestigt werden aktuelle Objekt.
Also Sie wollen ein proxy-Objekt, dass über den proxy/Stellvertreter auf solche Methoden.
Und controller:
Der größte Nachteil an diesem Ansatz ist, dass aus dem Helfer-Funktionen, die Sie nicht haben Zugang zu den controller-context (Z.B., die Sie nicht haben Zugriff auf Parameter, session, etc)
Ein Kompromiss wäre zu erklären, die Funktionen als private in der helper-Modul, daher,, wenn Sie beinhalten das Modul, dann werden Sie auch privat in der controller-Klasse.
als Damien hingewiesen.
Update: Der Grund, warum man den 'url_for' Fehler ist, dass Sie nicht haben, Zugang zu controller-Kontext, wie oben angegeben. Sie zwingen könnte die übergabe der Steuerung als parameter(Java-style 😉 ) wie:
und dann in dein Helfer:
oder Veranstaltung zu einem größeren hack, vorgestellt hier. Allerdings würde ich empfehlen die Lösung mit Methoden, private und diese in den controller.
Yap, müssen Sie Zugriff auf den Kontext des controller.
Ich aktualisiert meine Antwort in Betracht zu ziehen, was Sie sagte.
Wäre das nicht Klasse << selbst auch die gleiche wie zu ersetzen sind durch verlängern?
InformationsquelleAutor Vlad Zloteanu
Helfer sind nur ruby-Module, die Sie enthalten kann, in jedem controller einfach wie jedes Modul.
Dein controller :
Sie können nicht nur eine Methode aus einem Modul. Erstellen Sie einen neuen Helfer, der nur mit den Methoden, die Sie aufnehmen möchten, in Verbindung. Und diese Methoden als private, so werden Sie nicht zugänglich sein von http-Anfragen.
InformationsquelleAutor Damien MATHIEU
Nehmen! http://apotomo.de/2010/04/activehelper-rails-is-no-pain-in-the-ass/
Das ist genau das, was Sie suchen, dude.
InformationsquelleAutor Nick