Доступ к calculate_asset_host из задачи rake?

Я пытался включить ActionView::Helpers::AssetTagHelper и множество его вариантов, но всегда получаю сообщение об ошибке NameError: undefined local variable or methodconfig' для main:Object`

Обновлено с дополнительной информацией

Мне нужно иметь возможность ссылаться на ресурс, который хранится на разных серверах в зависимости от среды. На моем компьютере для разработки он будет указан по адресу localhost:3000, на рабочем сервере он будет находиться по одному адресу CDN, а при подготовке — по другому. Очевидно, что мы хотим сначала протестировать эту задачу rake локально, затем на стадии и, наконец, на стадии подготовки, поэтому задачи rake должны иметь возможность генерировать URL-адреса на основе переменной конфигурации хоста актива. На самом деле я зашел так далеко, что создал метод ApplicationHelper с именем asset_path, чтобы сделать это в своих представлениях, но в основном это просто псевдоним для compute_asset_host. Однако, если я включаю ApplicationHelper в мою задачу rake и вызываю asset_path, он жалуется, что calculate_public_path не определен, а затем, если я включаю (или расширяю) ActionView::Helpers::AssetTagHelper, он жалуется на undefined local variable or method 'config' for main:Object изнутри calculate_asset_host. Поэтому мне нужно каким-то образом вызвать все, что создает экземпляр контейнера конфигурации, который используется ActionView::Helpers, чтобы Compute_asset_host мог вернуть правильный URL-адрес в зависимости от среды.


person Chris Bloom    schedule 29.06.2011    source источник
comment
Можете ли вы добавить более подробную информацию о том, чего вы пытаетесь достичь? Мне неясно, почему вы хотите вызвать помощник View в задаче rake.   -  person Midwire    schedule 29.06.2011


Ответы (2)


Это некрасиво, и я стараюсь делать такие вещи, но...

namespace :test do

  def view(url_options = {}, *view_args)
    view_args[0] ||= ActionController::Base.view_paths
    view_args[1] ||= {}

    view = ActionView::Base.new(*view_args)
    routes = Rails::Application.routes
    routes.default_url_options = {:host => 'localhost'}.merge(url_options)

    view.class_eval do
      include ApplicationHelper
      include routes.url_helpers
    end

    assigns = instance_variables.inject(Hash.new) do |hash, name|
      hash.merge name[1..-1] => instance_variable_get(name)
    end
    view.assign assigns

    view
  end  

  task :it => :environment do
    param = ""
    puts ">>> compute_asset_host returns: [#{view.send("compute_asset_host", param)}]"
  end

end

... может подтолкнуть вас к решению проблемы, с которой вы столкнулись.

PS: я нашел метод просмотра здесь: https://gist.github.com/592846

person Midwire    schedule 29.06.2011

Вот что я делаю

task :it => :environment do
  include ActionView::Helpers
  include ApplicationHelper
  # your code here
end
person Ivan Torres    schedule 24.05.2012