58 votes

Comment mélanger et appeler link_to depuis le contrôleur dans Rails?

Cela semble être une question de noob, mais la réponse la plus simple est de se soustraire à moi. J'ai besoin d'appeler link_to en ActionController méthode pour cracher un lien HTML. ActionView::Helpers::UrlHelper.link_to des appels url_for, mais cela demande de l'AV du module version à la place de la manette. J'ai réussi à forcer en faisant ce que j'ai essayé 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 de savoir pourquoi cela fonctionne exactement. Quelqu'un pourrait-il expliquer la portée de la méthode et de la clandestinité ce passe ici? Ce qui est une meilleure façon de mélanger link_to (ou, plus généralement, à ne comprennent que quelques méthodes à partir d'un module) pour que je puisse l'appeler dans le contrôleur (génération d'un flash chaîne avec un lien est le cas d'utilisation.)

S'il vous plaît, pas de cours sur la MVC-si quoi que ce soit, link_to devrait être dans un module séparé url_for. À en juger par la quantité de bruit sur ce, beaucoup de gens courir dans cette anodin accrocher et finir par perdre une heure à faire le "Rails" alors vraiment ce qui est voulu est d'une minute de hack pour faire mon application fonctionne maintenant. Est-il un "Rails de chemin" pour ce faire avec les aides, peut-être? Ou mieux ruby façon?

117voto

Yacine Zalouani Points 1716

Compatible avec Rails 3 et 4:

 view_context.link_to
 

71voto

house9 Points 9240

ce n'est pas vraiment répondre à votre question, mais il y a un moyen plus facile

Pour Rails 3 et 4, puisque vous êtes en utilisant 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 les Rails 2, puisque vous utilisez l'aide d'un contrôleur, vous pouvez accéder à l' @template variable de membre de la manette, le @template est le point de vue et a déjà le UrlHelper mixte 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 probablement la voie à suivre

1voto

brentmc79 Points 1367

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

0voto

gucki Points 1416

Je pense que la solution la plus propre est de mettre le texte dans une vue et d'utiliser "render_to_string" depuis le contrôleur.

0voto

Sascha Konietzke Points 897

J'ai toujours eu des problèmes en utilisant mes propres méthodes d'aide que l'utilisation intégrée dans les méthodes d'aide dans un contrôleur avec ActionController.helper.my_method.

De toute évidence en utilisant render_to_string pour chaque flash de travail, mais je ne veux pas créer de nombreuses petites partiels pour chaque flash.

Ma solution a été de créer une petite aide pour les contrôleurs d'exécuter du code dans un partiel.

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

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

Le HAML partielle (helper.html.haml):

= instance_eval &block 

Même serait de travailler dans ERB (helper.html.erb):

<%= instance_eval &block %>

L'utiliser comme ceci dans votre contrôleur à l'appel de la my_custom_helper_function qui est définie dans un helper:

redirect_to url, :notice => h{my_custom_helper_function}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X