2010-09-27 16 views
7

Supuestamente, ActionController::Base.helpers actúa como un proxy para acceder a los ayudantes fuera de las vistas. Sin embargo muchos de los métodos definidos no dependen de las variables del controlador y no soy capaz de succesfully llamada:AssetTagHelper :: image_path fuera de las vistas

ActionController::Base.helpers.image_path("my_image.png") 
>> TypeError Exception: can't convert nil into String 

de excavación en la fuente veo compute_asset_host método está intentando acceder a config.asset_host pero config es nil.

¿Cómo puedo llamar con éxito a image_path desde el exterior?

+0

¡Quisiera saber lo mismo! –

Respuesta

0

This solution, publicado por Mason Jones, trabaja para mí.

En el controlador de aplicación:

def self.tag_helper 
    TagHelper.instance 
end 

class TagHelper 
    include Singleton 
    include ActionView::Helpers::TagHelper 
    include ActionView::Helpers::AssetTagHelper 
end 

entonces usted puede hacer el siguiente tipo de cosas, o cualquier otra cosa que necesite.

active_scaffold :mything do |config| 
    config.columns = [:name, :number, :active, :description] 
    config.update.link.label = tag_helper.image_tag('document_edit.png', :width => "30") 
    config.delete.link.label = tag_helper.image_tag('document_delete.png', :width => "30") 
    config.show.link.label = tag_helper.image_tag('document.png', :width => "30") 
    list.sorting = {:name => 'ASC'} 
end 

Está creando una instancia de Singelton de TagHelper en su ApplicationController. Esto te brinda los ayudantes donde sea que los necesites. Él lo explica en su publicación.

Además, utilizo esto para extender mis modelos (para crear un asistente image_tag más flexible que devuelve una imagen predeterminada si no hay imagen presente - por ejemplo person.small_image es una variable de instancia del modelo persona, que usa tag_helper) . Para hacer eso, he puesto el mismo código en un inicializador de Parche de Mono que extiende ActiveRecord :: Base. Luego llamo a ActiveRecord :: Base.tag_helper desde mis modelos. Esto es un poco complicado, pero soy nuevo en los rieles. Probablemente haya una manera más limpia.

Espero que ayude.

12

Uso view_context para acceder a esos métodos de ayuda que están disponibles en la vista.

Puede llamar al image_path de esta manera desde el controlador.

view_context.image_path "my_image.png" 
+1

¡Esto funciona realmente bien! ¡Perfecto! –

Cuestiones relacionadas