我正在编写一个简单的gem,可以从文本文件和zip存档加载并保存数据。因此,它有四种方法:尊敬load_from_file
,load_from_zip
,save_to_file
和save_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.rb
和data.txt
,我可以在不指定绝对路径的情况下从该目录中读取文件。
示例:
# app.rb
require 'my_gem'
my_gem = MyGem.new
my_gem.load_from_file('data.txt')
(抱歉英语不好)
UPD:这不是Rails的宝石,而且我没有使用Rails。所有这些只是纯粹的Ruby。
答案 0 :(得分:1)
如果我理解正确,你不需要改变任何东西。
在app.rb
内和gem
内,相对路径将相对于Dir.pwd
理解。
如果您从ruby app.rb
内部运行/home/user/my_app
:
Dir.pwd
将为/home/user/my_app
app.rb
和my_gem
都会在'data.txt'
内寻找/home/user/my_app
。如果由于某种原因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_path
或File.join
。请不要连接字符串。
如果您不相信相对路径将被正确解析,您可以发送方法的绝对路径:
my_gem.load_from_file(File.expand_path('data.txt'))