gpt4 book ai didi

ruby-on-rails - rails 使用 URI.parse 验证 url 抛出意外结果

转载 作者:太空宇宙 更新时间:2023-11-03 17:44:47 25 4
gpt4 key购买 nike

我正在关注这个 solution验证 Rails 应用程序中服务类中的 URL。测试返回 false,但在控制台中,当我使用 Ruby 的 URI 类解析给定的 url 时,没有出现错误。我认为我的代码中有任何拼写错误 - 有什么我出错的建议吗?

class UrlService
attr_accessor :uri

def initialize(uri)
@uri = uri
end

def valid?
begin
uri = URI.parse(uri)
!uri.host.nil? && uri.kind_of?(URI::HTTP)
rescue URI::InvalidURIError
false
end
end

end

测试

require "rails_helper"

RSpec.describe UrlService do
subject {described_class.new(url)}

describe "#valid?" do
context "success" do
let(:url) { "https://www.google.com/" }

it "returns true" do
expect(subject.valid?).to be_truthy
end
end
end

end

最佳答案

你的问题实际上是一个 Ruby 陷阱,在这一行:

uri = URI.parse(uri)

希望发生的是将 uri 重新定义为 uri 的解析版本。 实际上 发生的是 Ruby 看到“哦,你正在定义一个新的局部变量 uri”;该新局部变量现在优先于您使用 attr_accessor 定义的方法 uri。出于某种原因,Ruby 在局部变量赋值期间将自引用计算为 nil。这是 shadowing 的示例.

因此,上面的语句导致 URI.parse 始终在 nil 值上执行,这就是为什么无论您将 URI 设置为什么,您的测试都会失败.要修复它,只需使用不同的变量名:

parsed_uri = URI.parse(uri)

附录:证明我没有编造的简短示例

irb(main):016:0> z
NameError: undefined local variable or method `z' for main:Object
from (irb):16
from /Users/rnubel/.rubies/ruby-2.3.3/bin/irb:11:in `<main>'
irb(main):017:0> z = z
=> nil

第一个语句失败了,因为它只是引用了一个不存在的局部变量。第二条语句成功,因为 Ruby 将 z 赋值中的 z 变量计算为 nil

irb(main):011:0> class Foo; def bar; "http://www.google.com"; end; end
=> :bar
irb(main):012:0> Foo.new.instance_exec { bar }
=> "http://www.google.com"
irb(main):013:0> Foo.new.instance_exec { bar = (puts bar.inspect) }
nil
=> nil

这与您遇到的问题相同;只需使用 puts 来在线检查值。它打印nil

关于ruby-on-rails - rails 使用 URI.parse 验证 url 抛出意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41940197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com