Ruby:如何找到相对于类实例化位置的路径



我正在创建一个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"}

最新更新