AssetTagHelper :: image_path внешние виды - PullRequest
7 голосов
/ 27 сентября 2010

Предположительно, 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 ]

12 голосов
/ 17 июля 2012

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

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

view_context.image_path "my_image.png"
5 голосов
/ 10 мая 2011

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

0 голосов
/ 11 марта 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

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

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

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

...