Использование File.join()
неверно. .join()
возвращает строку, а затем применяя .last
к ней, генерирует ошибку, потому что для объектов String нет метода .last
.
pry(main)> extension = '.xml'
=> ".xml"
pry(main)> File.join(extension).last
NoMethodError: undefined method `last' for ".xml":String
Вместо этого вам нужно передать массив элементов пути, который вы хотите присоединиться в пути к файлу:
pry(main)> File.join('.', 'path', 'to', 'a', 'file.ext')
=> "./path/to/a/file.ext"
или:
pry(main)> File.join('/', 'path', 'to', 'a', 'file.ext')
=> "/path/to/a/file.ext"
Потратьте время, чтобы прочитать о Ruby's File
класс. Он позволяет работать с файлами и путями довольно независимым от ОС образом.
dirname
Его, basename
и extname
методы удобны, когда рассекает пути:
pry(main)> File.dirname('/path/to/a/file.ext')
=> "/path/to/a"
pry(main)> File.basename('/path/to/a/file.ext')
=> "file.ext"
pry(main)> File.extname('/path/to/a/file.ext')
=> ".ext"
Там также split
метод, который сочетает в себе dirname
и basename
, возвращая как путь и «filename.ext», что позволяет использовать параллельное назначение:
pry(main)> dirname, filename = File.split('/path/to/a/file.ext')
=> ["/path/to/a", "file.ext"]
File.basename
принимает необязательный параметр «расширение», что позволяет ему сдирать в extensi на:
pry(main)> File.basename('/path/to/a/file.ext', '.ext')
=> "file"
Объедините все, что магическое совершенство и вы можете сбросить, шпинделя и калечить ваши имена файлов и пути в течение всего дня.
Я предполагаю, что вы имели в виду * расширение *, а не * префикс *, и я обновил ваш вопрос, чтобы это отразить. –
@AndrewMarshall, спасибо, спасибо. Префикс - это часть слова, добавленная к началу. – SHUMAcupcake
Как предупреждение всем, кто использует вышеуказанный код; Как написано, у него есть возможность получить один и тот же URL несколько раз, тратя время и пропускную способность. Обычно для страницы есть несколько ссылок на другие страницы на сайте, и каждый из них будет посещаться, поскольку код перебирает теги ''. Поскольку требование OPs предназначено для XML-файлов, перечисленных на странице, это, вероятно, позволит избежать этой проблемы, но другие использования кода, вероятно, не будут настолько удачными. Добавьте 'set', который отслеживает ранее полученные URL-адреса, или сначала просматривает страницу для URL-адресов, и сохраняет их в наборе, а затем перебирает по ней. –