¿Cómo mezclar y llamar a Link_to desde el controlador en rieles?
-
27-09-2019 - |
Pregunta
Esto parece una pregunta de novato, pero la respuesta simple es eludirme. Necesito llamar link_to
en un ActionController
Método para escupir un enlace HTML. ActionView::Helpers::UrlHelper.link_to
llamadas url_for
, pero esto llama a la versión del módulo AV en lugar de la del controlador. Me las arreglé para obligar a esto a hacer lo que pretendía poner
#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. ¿Alguien podría explicar el alcance del método y la ocultación que está sucediendo aquí? ¿Cuál es la mejor manera de mezclar? 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, si algo, 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 inconveniente aparentemente trivial y terminan desperdiciando una hora haciéndolo por la "forma de rieles" cuando realmente lo que se quiere es un hack de un minuto para que mi aplicación funcione ahora. ¿Hay una "forma de rieles" para hacer esto con ayudantes tal vez? ¿O una mejor manera de rubí?
Solución
Esto realmente no responde a tu pregunta, pero hay una manera más fácil
Para rieles 5, utilizar el helpers
apoderado
helpers.link_to '...', '...'
Para rieles 3 y 4, ya que está utilizando el ayudante de un controlador, puede usar el View_Context
# in the controller code
view_context.link_to '...', '...'
# instead of using your mixin code
link_to '...', '...'
Para rieles 2, Dado que está utilizando el ayudante de un controlador, puede acceder a la variable de miembro @template del controlador, el @template es la vista y ya tiene la URLHelper mezclada en
# in the controller code
@template.link_to '...', '...'
# instead of using your mixin code
link_to '...', '...'
Si necesita usar la URLHelper del código que no sea el controlador, su solución es probablemente el camino a seguir
Otros consejos
Compatible con rieles 3,4 y 5:
view_context.link_to
Puedes hacerlo así:
ActionController.helpers.link_to("Click Me!", awesome_path)
Pero realmente, un lugar mejor para generar ese enlace podría estar en un módulo de ayuda donde ya están incluidos los ayudantes de Urlhelper y otros ayudantes relacionados con la vista.
actualizar
Este enfoque está desactualizado y ya no funciona.
Todavía tenía problemas para usar mis propios métodos auxiliares que usan métodos Helper incorporados en un controlador con ActionController.helper.my_method.
Obviamente, usar render_to_string para cada flash funcionaría, pero no quiero crear tantos pequeños parciales para cada flash.
Mi solución era crear un pequeño ayudante para que los controladores ejecuten el código en 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 así en su controlador para llamar al my_custom_helper_function que se define en un ayudante:
redirect_to url, :notice => h{my_custom_helper_function}