根据环境传递不同的符号作为参数

Passing different symbols as a parameter depending on the enviroment

我今天开始学习 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)

它不起作用。 returns 当我尝试连接到本地主机时出现此错误:

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 人,所以我从没想过这里的全局变量会有所不同。

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

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

ssl_methos 您需要像对全局变量所做的那样更改为 ssl_method

像这样的东西应该可以工作:

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),但我想我知道错误的根本原因(或者至少有一个合理的猜测,因为我在测试行为时做了同样的事情).

在您的代码片段中,您使用了 ssl_method(单数,用于 2 个赋值),但在您的 get 调用中,您尝试对 ssl_methods 变量使用 call/look (复数,在 HTTParty 调用中)。

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