打开gem

时间:2017-02-07 11:40:19

标签: ruby

我正在编写一个简单的gem,可以从文本文件和zip存档加载并保存数据。因此,它有四种方法:尊敬load_from_fileload_from_zipsave_to_filesave_to_zip。问题是我无法弄清楚如何为这些方法指定加载和保存的相对路径。他们走了:

def load_from_file(filename)
  File.open(filename) do |f|
    f.each { |line| add(line) } # `add` is my another class method
  end
end

def load_from_zip(filename)
  Zip::File.open("#{filename}.zip") do |zipfile|
    zipfile.each { |entry| read_zipped_file(zipfile, entry) } # my private method
  end
end

def save_to_file(filename)
  File.write("#{filename}.txt", data)
end

def save_to_zip(filename)
  Zip::File.open("#{filename}.zip", Zip::File::CREATE) do |zipfile|
    zipfile.get_output_stream('output.txt') { |f| f.print data }
  end
end

private

def read_zipped_file(zipfile, entry)
  zipfile.read(entry).lines.each { |line| add(line) }
end

所以我想要的基本上是允许这个gem通过相对路径加载和保存文件,无论它在系统中使用,例如我的应用程序位于/home/user/my_app,有两个文件 - app.rbdata.txt,我可以在不指定绝对路径的情况下从该目录中读取文件。

示例:

# app.rb
require 'my_gem'

my_gem = MyGem.new
my_gem.load_from_file('data.txt')

(抱歉英语不好)

UPD:这不是Rails的宝石,而且我没有使用Rails。所有这些只是纯粹的Ruby。

1 个答案:

答案 0 :(得分:1)

简短回答

如果我理解正确,你不需要改变任何东西。

app.rb内和gem内,相对路径将相对于Dir.pwd理解。

如果您从ruby app.rb内部运行/home/user/my_app

  • Dir.pwd将为/home/user/my_app
  • app.rbmy_gem都会在'data.txt'内寻找/home/user/my_app

有用的方法,以防万一

Dir.chdir

如果由于某种原因Dir.pwd不是所需的文件夹,您可以change directory

Dir.chdir('/home/user/my_app') do
  # relative paths will be based from /home/user/my_app
  # call your gem from here
end

获取当前文件的目录:

__dir__将帮助您获取目录:

  

返回文件目录的规范化绝对路径   从中调用此方法。

获取当前文件:

__FILE__将返回当前文件。 (注意:uppercase。)

连接文件路径:

如果您需要连接文件路径,请使用File.expand_pathFile.join。请不要连接字符串。

如果您不相信相对路径将被正确解析,您可以发送方法的绝对路径:

my_gem.load_from_file(File.expand_path('data.txt'))