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 из моих моделей. Это немного грязно, но я новичок в рельсах. Там, наверное, более чистый способ.
Надеюсь, это поможет.