【问题标题】:Passing different symbols as a parameter depending on the enviroment根据环境传递不同的符号作为参数
【发布时间】:2021-10-09 00:23:10
【问题描述】:

我今天开始学习 ruby​​,但我很难理解符号以及如何正确使用它们。

现在我在一个简单的服务器和网站上工作,当我在远程服务器上测试时,我使用:TLSv1 证书,在我的本地机器上使用:SSLv23 证书,因为它不需要还有什么。

因此,在这些不同的环境中进行测试时不必更改证书——因为我可能忘记更改——我尝试为它们设置一个标志,如下所示:

if ENV['environment'] == 'development'
  ssl_method = ":SSLv23"
else
  ssl_method = ":TLSv1"
end

response = HTTParty.get('mywebsite.com/', :ssl_version => ssl_methos.to_sym)

它不工作。当我尝试连接到 localhost 时,它会返回此错误:

undefined local variable or method `ssl_method' for #<service> Did you mean? method 

我可以使用什么替代方法?

更新

嗯,我不知道是否有更好的选择,所以我改变了这个并开始工作。

if ENV['environment'] == 'development'
  $ssl_method = "SSLv23"
else
  $ssl_method = "TLSv1"
end

response = HTTParty.get('mywebsite.com/', :ssl_version => $ssl_method.to_sym)

我忘记从字符串中删除:,我不得不使用$ 来定义为全局变量。我是一个 python 人,所以我从没想过这里的全局变量会有所不同。

【问题讨论】:

  • 请在 ruby​​ 中寻找变量作用域,了解何时使用哪种作用域。 $ 变量有效,但强烈建议不要使用,因为全局变量可以在 ruby​​ 应用程序中的任何位置更改。尝试在 if 块之前初始化本地变量。

标签: ruby-on-rails ruby symbols httparty


【解决方案1】:

这样的事情应该可以工作:

ssl_method =
  if ENV['environment'] == 'development'
    :SSLv23
  else
    :TLSv1
  end

response = HTTParty.get('mywebsite.com/', :ssl_version => ssl_method)

在我的示例中,这 2 个 ssl 方法只是符号。在您的 get 调用中,您只是将它们转换回带有 to_sym 的符号,但如果您将它们初始化为符号,则无需转换它们。

您的代码示例有错字 (methos),但我想我知道错误的根本原因(或者至少有一个合理的猜测,因为我在测试行为时做了同样的事情)。

在您的代码 sn-p 中,您使用了 ssl_method(单数,用于 2 个分配),但在您的 get 调用中,您尝试调用/查找 ssl_methods 变量(复数,在 HTTParty 调用中) .

由于 ssl_methods 从未被分配为变量或定义为方法,Ruby 认为您可能打算调用 method 方法(这实际上是 ruby​​ 中的方法)

【讨论】:

    【解决方案2】:

    你不需要定义一个全局变量,在这里使用符号也没有问题,我注意到这里有一个错字

    HTTParty.get('mywebsite.com/', :ssl_version =&gt; ssl_methos.to_sym)

    ssl_methos 您需要像使用全局变量一样更改为 ssl_method

    【讨论】:

      猜你喜欢
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 2021-01-21
      • 2021-01-03
      相关资源
      最近更新 更多