Mes méthodes d'aide dans le contrôleur
Mon application doit afficher le code html, afin de répondre lorsqu'un utilisateur clique sur ajax-link.
Mon contrôleur:
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
Mon aide:
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
J'ai essayé ces méthodes:
ApplicationController.helpers.link_to_profile(@user)
# It raises: NoMethodError (undefined method `url_for' for nil:NilClass)
et:
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)
En plus, oui, je CONNAIS :helper_method, et il fonctionne, mais je ne veux pas surcharger ma ApplicationController avec une abondance de méthodes
OriginalL'auteur Vizakenjack | 2010-04-07
Vous devez vous connecter pour publier un commentaire.
Oki. Récapitulons. Vous souhaitez accéder à certaint fonctions/méthodes, mais vous ne voulez pas de ces méthodes pour être attaché à l'objet courant.
Si vous voulez vous faire un objet proxy, qui proxy/délégué à ces méthodes.
Et, dans le contrôleur:
Le principal inconvénient de cette approche est que, depuis les fonctions d'assistance, vous n'aurez pas accès au contrôleur de contexte (par exemple, vous n'aurez pas accès aux paramètres de session, etc)
Un compromis serait de déclarer les fonctions privées dans le module d'aide, par conséquent, lorsque vous allez inclure le module, ils seront également privés dans la classe du contrôleur.
comme Damien souligné.
Mise à jour: La raison pour laquelle vous obtenez le "url_for' erreur, c'est que vous n'avez pas accès à du contrôleur de contexte, comme indiqué ci-dessus. Vous pouvez forcer le passage de l'appareil en tant que paramètre(Java-style 😉 ) comme:
et puis, dans votre helper:
ou de l'événement un plus gros hack, présenté ici. Cependant, je vous recommande la solution avec les procédés de fabrication et privé, y compris dans le contrôleur.
Yap, vous devez avoir accès au contexte du contrôleur.
J'ai mis à jour ma réponse à prendre en considération ce que vous avez dit.
Ne serait pas de classe << auto inclure le même que le remplacement comprennent-elle s'étendre?
OriginalL'auteur Vlad Zloteanu
aides sont juste ruby modules que vous pouvez inclure dans n'importe quel contrôleur tout comme n'importe quel module.
Et, dans votre contrôleur :
Vous ne pouvez pas inclure une seule méthode à partir d'un module. Créer un nouveau helper avec seulement les méthodes que vous souhaitez inclure dans le contrôleur. Et d'inclure ces méthodes privé pour ne pas être accessible à partir de requêtes http.
OriginalL'auteur Damien MATHIEU
Prendre! http://apotomo.de/2010/04/activehelper-rails-is-no-pain-in-the-ass/
C'est exactement ce que vous recherchez, mec.
OriginalL'auteur Nick