我正在创建一个gem,它是一个Rack应用程序,所以我假设我的应用程序将在config.ru文件中实例化。我希望某些路径是相对于这个config.ru文件的。那么,当应用程序初始化时,我如何获取和设置路径呢?
例如:
藏在我的宝石里:
class MyApp
def initialize
@base_path = get_the_base_path_here
end
def call(env)
html = render_view(@base_path + '/views/index.erb')
end
end
gem的config.ru:的用户
require 'my_app'
run MyApp.new
以及他们的视图目录:
/views
index.erb
更新:
实现这一点的一种方法是将基本路径作为自变量传递,但我想找到一种不将其作为自变量传递的方法。
require 'my_app'
run MyApp.new(File.dirname(__FILE__))
当前文件的绝对路径
通常,您可以简单地使用File.expand_path(__FILE__)
来查找当前文件的绝对路径,然后可以存储变量或全局路径(如果您愿意)。例如:
$file_path = File.expand_path(__FILE__)
当前程序的绝对路径
File.expand_path($0)
类似,但返回被调用的程序。这种区别有时很微妙,但有时会很有用。
在同一基本目录中创建文件的绝对路径
如果要使用当前文件所在位置的目录名来寻址另一个文件,可以使用file#join。例如:
File.join File.dirname(File.expand_path(__FILE__)), '.X11-unix'
=> "/tmp/.X11-unix"
可能不是最好的方法,但您可以通过以下方式找到config.ru:
$:.find{|path| File.exists? "#{path}/config.ru"}