Сбой Rake-рейка просто в работе: "NoMethodError: закрытый метод` open 'вызван для URI: Module " - PullRequest
0 голосов
/ 04 февраля 2020

Я пишу задание на грабли, функция которого заключается в получении информации с другой веб-страницы. Для этого я использую open-uri и nokogiri. Я тестировал в разработке, и он выполняет свою работу, но затем я развертываюсь на производственном сервере и не работает.

Это код:

require 'open-uri'
require 'nokogiri'

desc 'recover eventos llerena'
task recover_eventos_llerena: :environment  do

  enlaces = []

  # Getting index and all links
  url = open(URI.parse("https://llerena.org/eventos/lista"))
  page = Nokogiri::HTML(url)

  page.css("a.fusion-read-more").each do |line|
    enlaces.push(line.attr('href'))
  end

  enlaces = enlaces.uniq

  #Inspecting everyone of them
  enlaces.each do |link|
    url = open(URI.parse(link))
    page = Nokogiri::HTML(url)

    title = page.css("h1").text
    if Evento.find_by_titulo(title) == nil

      description = page.css(".tribe-events-single-event-description.tribe-events-content.entry-content.description p").text
      date = page.css(".tribe-events-abbr").attr('title')
      image = page.css(".size-full").attr('src')

      Evento.create!(
        titulo: title,
        remote_imgevento_url: image,
        info: description,
        fecha: Date.parse(date)
      )

    end
  end

end

При проверке cron_error_log я получаю:

rake aborted!
NoMethodError: private method `open' called for URI:Module
/home/deploy/guialocal/releases/20200204193434/lib/tasks/example.rake:23:in `block in <top (required)>'
/home/deploy/guialocal/shared/bundle/ruby/2.4.0/gems/rake-13.0.1/exe/rake:27:in `<top (required)>'
/home/deploy/.rvm/gems/ruby-2.4.4/gems/bundler-2.0.1/lib/bundler/cli/exec.rb:74:in `load'
/home/deploy/.rvm/gems/ruby-2.4.4/gems/bundler-2.0.1/lib/bundler/cli/exec.rb:74:in `kernel_load'
/home/deploy/.rvm/gems/ruby-2.4.4/gems/bundler-2.0.1/lib/bundler/cli/exec.rb:28:in `run'
/home/deploy/.rvm/gems/ruby-2.4.4/gems/bundler-2.0.1/lib/bundler/cli.rb:463:in `exec'
/home/deploy/.rvm/gems/ruby-2.4.4/gems/bundler-2.0.1/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/home/deploy/.rvm/gems/ruby-2.4.4/gems/bundler-2.0.1/lib/bundler/vendor/thor/lib/thor/invocation.rb:126:in `invoke_command'
/home/deploy/.rvm/gems/ruby-2.4.4/gems/bundler-2.0.1/lib/bundler/vendor/thor/lib/thor.rb:387:in `dispatch'
/home/deploy/.rvm/gems/ruby-2.4.4/gems/bundler-2.0.1/lib/bundler/cli.rb:27:in `dispatch'
/home/deploy/.rvm/gems/ruby-2.4.4/gems/bundler-2.0.1/lib/bundler/vendor/thor/lib/thor/base.rb:466:in `start'
/home/deploy/.rvm/gems/ruby-2.4.4/gems/bundler-2.0.1/lib/bundler/cli.rb:18:in `start'
/home/deploy/.rvm/gems/ruby-2.4.4/gems/bundler-2.0.1/exe/bundle:30:in `block in <top (required)>'
/home/deploy/.rvm/gems/ruby-2.4.4/gems/bundler-2.0.1/lib/bundler/friendly_errors.rb:124:in `with_friendly_errors'
/home/deploy/.rvm/gems/ruby-2.4.4/gems/bundler-2.0.1/exe/bundle:22:in `<top (required)>'
/home/deploy/.rvm/gems/ruby-2.4.4/bin/bundle:23:in `load'
/home/deploy/.rvm/gems/ruby-2.4.4/bin/bundle:23:in `<main>'
Tasks: TOP => recover_eventos_llerena
(See full trace by running task with --trace)

И, наконец, я попытался запустить консоль в производственном режиме, получив:

2.4.0 :001 > Rake::Task['recover_eventos_llerena'].execute
NameError: uninitialized constant Rake::Task
    from (irb):1

В Rails 2.7.0 есть предупреждение для будущего устаревания, и я изменил также предложенный новый способ ( без результатов):

url = URI.open("https://llerena.org/eventos/lista")

Почему это происходит?

1 Ответ

0 голосов
/ 31 марта 2020

Не на рельсах, но похожая проблема: я написал и запустил скрипт на машине с ruby 2.7.0, при попытке запустить тот же скрипт на машине с ruby 2.3.0 я получил ту же ошибку как вы.

После изучения файла open-uri.rb (в моем случае /usr/lib/ruby/2.7.0/) я обнаружил, что файл более старой версии ruby не имеет метода publi c в модуле URI.

Вместо этого вам нужно использовать Kernel # Open. Таким образом, ваш сценарий станет:

url = open("https://llerena.org/eventos/lista")
...