encode_ www_form_component проблема с Фарадеем - PullRequest
0 голосов
/ 04 мая 2020

В настоящий момент я переписываю целое приложение с Rails 3 на Rails 6.

В этом процессе я также очищаю много вещей.

Но вот моя проблема.

У меня есть модуль с именем Reusable, который, как следует из названия, содержит массу методов многократного использования в разных моделях.

Мы используем Faraday, чтобы установить sh соединение с определенным сервером:

Старый код выглядел следующим образом:

module Reusable
  def self.establish_connection(url)
    url = I18n.transliterate(url)
    url = URI.encode(url)
    conn = Faraday.new(url: url) do |builder|
      builder.use :cookie_jar
      builder.use FaradayMiddleware::FollowRedirects
      builder.adapter Faraday.default_adapter
    end
    conn.get
    conn
  rescue Faraday::ConnectionFailed, Faraday::TimeoutError, Errno::ETIMEDOUT => e
    message = "(Timeout::Error) Connection to address: #{url} failed. If address is reachable please run the method again."
  end
end

Однако при переходе на Ruby 2.7.0, у нас страшное URI.encode является устаревшим предупреждением.

Чтобы избавиться от этого, я переписал целую часть примерно так:

module Reusable
  def self.establish_connection(url)
    url = I18n.transliterate(url)
    url = URI.encode_www_form_component(url)

    conn = Faraday.new(url: url) do |builder|
      builder.request :url_encoded
      builder.use :cookie_jar
      builder.use FaradayMiddleware::FollowRedirects
      builder.adapter Faraday.default_adapter
    end
    conn.get
    conn
  rescue Faraday::ConnectionFailed, Faraday::TimeoutError, Errno::ETIMEDOUT => e
    message = "(Timeout::Error) Connection to address: #{url} failed. If address is reachable please run the method again."
  end
end

Однако я получаю это:

reusable_image

Я искал SO для решения этой проблемы, и я нашел это -> URI :: InvalidURIError (неверный URI (не URI?):):

Но это снова возвращает меня к использованию URI.encode, которого я хочу избежать.

Есть какое-нибудь решение этой проблемы, или я должен просто спокойно пока игнорировать устаревшее предупреждение, пока не появится что-то лучшее?

1 Ответ

1 голос
/ 04 мая 2020

Попробуйте это:

module Reusable
  def self.establish_connection(url)
    url = I18n.transliterate(url)
    params = Rack::Utils.parse_nested_query(URI(url).query)

    conn = Faraday.new(url: url, params: params) do |builder|
      builder.request :url_encoded
      builder.use :cookie_jar
      builder.use FaradayMiddleware::FollowRedirects
      builder.adapter Faraday.default_adapter
    end
    conn.get
    conn
  rescue Faraday::ConnectionFailed, Faraday::TimeoutError, Errno::ETIMEDOUT => e
    message = "(Timeout::Error) Connection to address: #{url} failed. If address is reachable please run the method again."
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...