从托管帐户(godaddy)将文件导入我的应用程序



我已经构建了几个Rake任务,将一系列CSV文件导入我的PostgreSQL数据库,但我总是将这些任务定向到本地计算机上的路径。

我需要将任务设置为访问一个安全的on目录,这样我的客户端就可以简单地将文件复制到这个目录中,当执行Rake任务时,它会自动从在线源中提取。

这似乎是我代码中的一个简单调整,但我不确定如何使其工作。如果有人建议阅读或可以快速帮助编辑我的代码,我们将不胜感激。

以下是我的Rake任务之一的副本:

require 'csv'
namespace :import_command_vehicles_csv do
  task :create_command_vehicles => :environment do
    puts "Import Command Vehicles"
    csv_text = File.read('/Users/Ben/Sites/ror/LFD/command_vehicles.csv', :encoding => 'windows-1251:utf-8')
    csv = CSV.parse(csv_text, :headers => true)
    csv.each_with_index do |row,index|
      row = row.to_hash.with_indifferent_access
      CommandVehicle.create!(row.to_hash.symbolize_keys)
      command_vehicle = CommandVehicle.last
      if @report_timesheet_hash.key?(command_vehicle.report_nr)
        command_vehicle.timesheet_id = "#{@report_timesheet_hash[command_vehicle.report_nr]}"
      end
      #command_vehicle.timesheet_id = @timesheet_id_array[index]
      command_vehicle.save
    end
  end
end

您可以创建可以接受参数的rake-tast,然后您可以传递任何您喜欢的路径。

查看此链接Set Multiple Environmental Variables On Invocation of Rake Task,了解如何通过环境变量和此链接传递参数http://viget.com/extend/protip-passing-parameters-to-your-rake-tasks查看括号符号。

'/Users/Ben/Sites/ror/LFD/command_vehicles.csv'只能在本地机器上工作,除非您在远程主机上有一个相同的资源路径,这是不可能的。因此,您需要将绝对路径更改为相对于文件的路径。

我的桌面上有一个文件夹层次结构,卡住了几个文件夹,比如:

-试验|lib|-测试.rb|配置|-config.yaml

test.rb包含:

File.realpath('../config/config.yaml', File.dirname(__FILE__))

__FILE__是一个特殊变量,它返回当前正在解释的脚本的绝对路径。如果你知道其他东西相对于当前__FILE__的存在位置,那么就很容易找到它在哪里。

realpath返回的值将是"config.yaml"文件的绝对路径,基于其与当前文件的相对路径。换句话说,这将返回类似于:

/Users/ttm/Desktop/tests/junk/test/config/config.yaml

Rake的好处是它确实使用了Ruby脚本,所以您可以利用File.realpath之类的东西。此外,请记住,Rake对当前工作目录的想法是基于正在运行的脚本的位置,因此它想要访问的所有内容都必须相对于脚本的位置或绝对路径,或者您必须使用chdircd来更改Rake对目前工作目录的看法。

做后面的事情最终会让我头疼,所以我更喜欢定义一些指向所需资源的常量,这样做很容易找到真正的绝对路径。

请参阅"如何获取Ruby中为使用提示调用的命令的名称?"了解更多信息。

最新更新