Question

Cela semble être une question de noob, mais la réponse est simple me échappe. Je dois appeler link_to dans une méthode de ActionController cracher sur un lien HTML. ActionView::Helpers::UrlHelper.link_to appelle url_for, mais cela appelle la version du module AV au lieu de celui du contrôleur. J'ai réussi à forcer cela en faire ce que je voulais en mettant

  #FIXME there must be a better way to mixin link_to
  alias_method :self_url_for, :url_for
  include ActionView::Helpers::UrlHelper
  alias_method :url_for, :self_url_for

dans le contrôleur. Mais, je ne suis toujours pas sûr pourquoi cela fonctionne exactement. Quelqu'un pourrait-il s'il vous plaît expliquer la portée de la méthode et de cacher ce qui se passe ici? Ce qui est une meilleure façon de mélanger link_to (ou plus généralement, pour inclure seulement quelques méthodes à partir d'un module) pour que je puisse l'appeler dans le contrôleur (générer une chaîne flash avec un lien est le cas d'utilisation.)

S'il vous plaît, pas de cours sur MVC - si quoi que ce soit, link_to doit être dans un module distinct de url_for. A en juger par la quantité de bruit à ce sujet, beaucoup de gens courent dans ce problème apparemment trivial et finissent par perdre une heure à faire le « chemin Rails », alors qu'en réalité ce qui est recherché est un hack d'une minute pour faire mon travail d'app. Y at-il une « façon Rails » de le faire avec des aides peut-être? Ou une meilleure façon rubis?

Était-ce utile?

La solution

Cela ne répond pas vraiment à votre question, mais il y a un moyen plus facile

Pour Rails 5 , utilisez la balise helpers proxy

helpers.link_to '...', '...'

Pour Rails 3 et 4 , puisque vous utilisez l'aide d'un contrôleur, vous pouvez utiliser le view_context

# in the controller code
view_context.link_to '...', '...'

# instead of using your mixin code 
link_to '...', '...'

Pour Rails 2 , puisque vous utilisez l'aide d'un contrôleur, vous pouvez réellement accéder à la variable membre @template du contrôleur, le @template est la vue et a déjà UrlHelper mélangé dans

# in the controller code
@template.link_to '...', '...'

# instead of using your mixin code 
link_to '...', '...'

si vous avez besoin d'utiliser le urlhelper de code autre que le contrôleur, votre solution est sans doute la voie à suivre

Autres conseils

Compatible avec Rails 3,4 et 5:

view_context.link_to

Vous pouvez le faire comme ceci:

ActionController.helpers.link_to("Click Me!", awesome_path)

Mais vraiment, un meilleur endroit pour générer ce lien pourrait être dans un module d'aide où UrlHelper et d'autres aides liées à la vue sont déjà inclus.

[mise à jour]

Cette approche est obsolète et ne fonctionne plus.

J'avais encore des problèmes en utilisant mes propres méthodes d'aide qui utilisent des méthodes d'aide intégré dans un contrôleur avec ActionController.helper.my_method.

Il est évident que l'utilisation render_to_string pour chaque flash fonctionnerait, mais je ne veux pas créer autant de petits partials pour chaque flash.

Ma solution était de créer un petit assistant pour les contrôleurs d'exécuter du code dans une partie.

La méthode d'assistance dans le contrôleur:

def h(&block)
  render_to_string(:partial => 'helper', :locals => {:block => block})
end

Le HAML partiel (helper.html.haml):

= instance_eval &block 

Même travaillerait en ERB (helper.html.erb):

<%= instance_eval &block %>

Utilisez comme ceci dans votre contrôleur pour appeler le my_custom_helper_function qui est défini dans une aide:

redirect_to url, :notice => h{my_custom_helper_function}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top