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í?

¿Fue útil?

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}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top