从rake任务中访问compute_asset_host?

时间:2011-06-29 16:06:37

标签: ruby-on-rails-3 rake actionview

我尝试过包含ActionView :: Helpers :: AssetTagHelper及其中的一些变种,但我总是收到一条错误:NameError: undefined local variable or method config'为main:Object`

更新了更多信息

我需要能够根据环境引用存储在不同服务器上的资源。在我的开发机器上,它将在localhost:3000处引用,在生产服务器上它将在一个CDN地址处,并且在暂存时它将在另一个CDN地址处。显然,我们想首先在本地测试这个rake任务,然后在staging上测试,然后最后在staging上测试,所以rake任务需要能够根据资产主机配置变量生成URL。我实际上创建了一个名为asset_path的ApplicationHelper方法来在我的视图中执行此操作,但它基本上只是compute_asset_host的别名。但是,如果我在我的rake任务中包含ApplicationHelper并调用asset_path它会抱怨compute_public_path未定义,然后如果我包含(或扩展)ActionView :: Helpers :: AssetTagHelper,它会从内部抱怨undefined local variable or method 'config' for main:Object compute_asset_host。所以我需要以某种方式调用实例化ActionView :: Helpers使用的配置容器,以便compute_asset_host可以根据环境返回正确的URL。

2 个答案:

答案 0 :(得分:0)

这很难看,我试着绕过这样的事情但是......

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

答案 1 :(得分:0)

这就是我的工作

task :it => :environment do
  include ActionView::Helpers
  include ApplicationHelper
  # your code here
end