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 со стороны взгляды?

3 ответа

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

Ты можешь позвонить image_path как это с контроллера.

view_context.image_path "my_image.png"

Для Rails 3, пожалуйста, ознакомьтесь с гораздо более чистым решением здесь. Как я могу использовать image_path внутри Rails 3 Controller?

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

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

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

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

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

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

Другие вопросы по тегам