Вывод списка файлов веб-каталога с рельсами 4

Ruby 2.0, Rails 4. Я сделал сайт, который обслуживает статические файлы. я использовал

 Dir.glob 

перечислить статические файлы Теперь мне нужно сохранить файлы вне приложения, потому что размер slugsize в Heroku будет слишком большим, иначе

По этой причине я хотел бы получить список каталогов общедоступной веб-папки. (Обслуживается сервером Apache)

Я попробовал: Gemfile:

gem 'net-ssh'

контроллер:

def index
  require 'net/ssh'

  ssh = Net::SSH.start( 'http://www.domain.ch/path/to/directory', 'gast')
  @files =ssh.exec!( 'ls . ').split("\n")
  ssh.close
end

Это подняло ошибку:

 Errno::ENOENT - No such file or directory - getaddrinfo:
 net-ssh (2.7.0) lib/net/ssh/transport/session.rb:67:in `block in initialize'
 /home/benutzer/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/timeout.rb:52:in `timeout'
 /home/benutzer/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/timeout.rb:97:in `timeout'
 net-ssh (2.7.0) lib/net/ssh/transport/session.rb:67:in `initialize'
 net-ssh (2.7.0) lib/net/ssh.rb:200:in `start'
 ...

Я никогда не слышал о файле с именем getaddrinfo

Ответ на этот поток `initialize': нет такого файла или каталога - getaddrinfo (Errno::ENOENT), когда новое приложение Rails (обновление rvm) не решило проблему.

Дополнительная информация:

$gem -v bundler
2.0.5
$rvm - v
rvm 1.21.12 (stable)

$rvm - v
rvm 1.23.9 (master)

1 ответ

Решение

Одним из больших преимуществ Ruby является то, что он использует только несколько основных вещей для реализации различных функций. Одной из вещей, где это доведено до крайности, является IO. Заимствовано из принципа UNIX "все является файлом", в Ruby "все является IO".

Итак, ошибка Errno::ENOENT - No such file or directory - getaddrinfo: это просто общая ошибка ввода-вывода, говорящая вам, что адрес http://www.domain.ch/path/to/directory невозможно найти. Было бы еще проще обнаружить эту ошибку, если бы вы указали номера строк в своем коде, поскольку они отображают от 1 до 1 с трассировкой стека, которую вы разместили.

Из того, что я знаю о SSH, он не заботится о URL. Это заботится о host а также user, опционально о пароле, но лучше использовать аутентификацию на основе ключей.

Поэтому, если вы посмотрите на пример net/ssh, вы увидите, что вам нужно передать хост, а не URL. В вашем примере это будет выглядеть примерно так:

require 'net/ssh'

Net::SSH.start('www.domain.ch', 'gast') do |ssh|
  ssh.exec!('ls path/to/directory')
end
Другие вопросы по тегам