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}