rails link_to ruby-on-rails helpers actionview link-to mixins

ruby on rails - ¿Cómo mezclar y llamar a link_to desde el controlador en Rails?



rails link_to params (4)

Compatible con los carriles 3,4 y 5:

view_context.link_to

Esto parece una pregunta noob, pero la respuesta simple me está eludiendo. Necesito llamar a link_to en un método ActionController para escupir un enlace HTML. ActionView::Helpers::UrlHelper.link_to llama a url_for , pero esto llama a la versión del módulo AV en lugar del controlador. Logré obligar a esto a hacer lo que pretendía poniendo

#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

en el controlador. Pero, todavía no estoy seguro de por qué funciona exactamente. ¿Podría alguien explicar el alcance del método y la ocultación que está sucediendo aquí? ¿Cuál es una mejor manera de mezclar en link_to (o en general, para incluir solo algunos métodos de un módulo) para que pueda llamarlo en el controlador (generar una cadena de flash con un enlace es el caso de uso)?

Por favor, no hay conferencias sobre MVC - en todo caso, link_to debe estar en un módulo separado de url_for . A juzgar por la cantidad de ruido en esto, muchas personas se encuentran con este obstáculo aparentemente trivial y terminan perdiendo una hora haciéndolo a la manera "Rails" cuando realmente lo que se necesita es un hack de un minuto para hacer que mi aplicación funcione ahora. ¿Hay una "manera de Rails" para hacer esto con los ayudantes quizás? ¿O una mejor forma de rubí?


Esto realmente no responde a tu pregunta pero hay una manera más fácil

Para Rails 3 y 4 , ya que está usando el helper de un controlador, puede usar view_context

# in the controller code view_context.link_to ''...'', ''...'' # instead of using your mixin code link_to ''...'', ''...''

Para Rails 2 , ya que está usando el ayudante de un controlador, en realidad puede acceder a la variable miembro de @template del controlador, @template es la vista y ya tiene el UrlHelper mezclado en

# in the controller code @template.link_to ''...'', ''...'' # instead of using your mixin code link_to ''...'', ''...''

Si necesita usar el urlhelper desde un código diferente al controlador, su solución es probablemente la solución.


Puedes hacerlo así:

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

Pero en realidad, un mejor lugar para generar ese enlace podría ser un módulo de ayuda donde UrlHelper y otros ayudantes relacionados con la vista ya estén incluidos.

[actualizar]

Este enfoque está desactualizado y ya no funciona.


Todavía tuve problemas al usar mis propios métodos de ayuda que usan métodos de ayuda incorporados en un controlador con ActionController.helper.my_method.

Obviamente, usar render_to_string para cada flash funcionaría, pero no quiero crear tantos parciales pequeños para cada flash.

Mi solución fue crear un pequeño ayudante para que los controladores ejecuten el código de forma parcial.

El método auxiliar en el controlador:

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

El HAML parcial (helper.html.haml):

= instance_eval &block

Lo mismo funcionaría en ERB (helper.html.erb):

<%= instance_eval &block %>

Úselo de esta manera en su controlador para llamar a la función my_custom_helper_función que está definida en un ayudante:

redirect_to url, :notice => h{my_custom_helper_function}