AssetTagHelper::image_path вне представлений

Предположительно, ActionController::Base.helpers действует как прокси для доступа к помощникам вне представлений. Однако многие из определенных там методов полагаются на переменные контроллера, и я не могу успешно вызвать:

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

Копаясь в источнике, я вижу, что метод compute_asset_host пытается получить доступ к config.asset_host, но config является nil.

Как я могу успешно вызвать image_path из внешних представлений?


person knoopx    schedule 27.09.2010    source источник
comment
Хотел бы узнать то же самое!   -  person Matt Huggins    schedule 18.11.2010


Ответы (3)


Используйте view_context для доступа к тем вспомогательным методам, которые доступны в представлении.

Вы можете вызвать image_path таким образом из контроллера.

view_context.image_path "my_image.png"
person keithepley    schedule 17.07.2012

Для Rails 3 ознакомьтесь с более чистым решением здесь Как можно Я использую image_path внутри контроллера Rails 3

person Jhony Fung    schedule 10.05.2011

Это решение, опубликованное Мэйсоном Джонсом, работает для меня.

В вашем контроллере приложений:

def self.tag_helper
  TagHelper.instance
end

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

Затем вы можете сделать следующее или что-то еще, что вам нужно.

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

Вы создаете экземпляр Singelton TagHelper в своем ApplicationController. Это дает вам помощников везде, где они вам нужны. Он объясняет это в своем посте.

Кроме того, я использую это для расширения своих моделей (для создания более гибкого помощника image_tag, который возвращает изображение по умолчанию, если изображение отсутствует — например, person.small_image — это переменная экземпляра модели человека, которая использует tag_helper). Для этого я поместил тот же код в инициализатор Monkey Patch, который расширяет ActiveRecord::Base. Затем я вызываю ActiveRecord::Base.tag_helper из своих моделей. Это немного беспорядочно, но я новичок в рельсах. Вероятно, есть более чистый способ.

Надеюсь, это поможет.

person NAD    schedule 11.03.2011