我尝试过包含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。
答案 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