不知道如何解决 Rubocop的 LintUriEscapeUnescape 警告
尝试更换 URI
与 CGI
以为那是 "drop in "的替换,但那把测试套件给毁了。
下面是错误,后面是一行代码,其中 URI
正在使用。
app/models/media_file.rb:76:5: W: Lint/UriEscapeUnescape: URI.escape method is obsolete and should not be used. Instead, use CGI.escape, URI.encode_www_form or URI.encode_www_form_component depending on your specific use case.
URI ...
^^^
# app/models/media_file.rb
...
def cdn_url(format: nil)
if format.nil?
"#{s3_config.cloudfront_endpoint}/#{escape_url(key)}"
elsif converted_urls.with_indifferent_access[format.to_s]
filename = converted_urls.with_indifferent_access[format.to_s]
if URI.parse(escape_url(filename)).host
filename
else
"#{s3_config.cloudfront_endpoint}/#{escape_url(filename)}"
end
else
converted(url)
end
end
...
private
def escape_url(url)
URI
.escape(url)
.gsub(/\(/, '%28')
.gsub(/\)/, '%29')
.gsub(/\[/, '%5B')
.gsub(/\]/, '%5D')
end
EDIT: 增加了用以下方法转义的字符串的输出示例 URI
和 CGI
:
url: images/medium/test-image.jpg
URI.escape(url): images/medium/test-image.jpg
CGI.escape(url): images%2Fmedium%2Ftest-image.jpg
url: images/medium/test-image.jpg
URI.escape(url): images/medium/test-image.jpg
CGI.escape(url): images%2Fmedium%2Ftest-image.jpg
看来是这样 CGI
并不能代替 URI
列表错误可能让你相信。有什么想法?
遇到了同样的问题,通过使用 可寻址 lib.
escaped_query = URI.escape(search,
Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
#W: Lint/UriEscapeUnescape: URI.escape method is obsolete and should not be used. Instead, use CGI.escape, URI.encode_www_form or URI.encode_www_form_component depending on your specific use case.
解决的。
addressable
蕴藏 gemspec
或 Gemfile
.gem 'addressable', '~> 2.7'
要求 addressable/uri
适当增加。
escaped_query = Addressable::URI.encode_component(search, Addressable::URI::CharacterClasses::QUERY)