在调用之前检查方法/属性是否已定义

Sra*_*mar 4 ruby ruby-on-rails ruby-on-rails-3 ruby-on-rails-4

我是 RoR 的新手。我试图弄清楚如何检查环境文件(在本例中为development.rb)中是否定义了属性。

我们在development.rb 文件中定义了一个属性,如下所示:

config.user = 'test-user'
Run Code Online (Sandbox Code Playgroud)

现在在代码中,我通过调用来使用它:

 Rails.application.config.user
Run Code Online (Sandbox Code Playgroud)

这给了我所需的价值。

但问题是这个配置有时可能会被禁用。因此,我想在分配该属性之前检查该属性是否已定义。就像是

user_name = (if Rails.application.config.user is available)? 
             Rails.application.config.user : 'some_other_value'
Run Code Online (Sandbox Code Playgroud)

我试过定义吗?和respond_to但没有工作。

任何帮助/建议表示赞赏。谢谢!

Fel*_*lix 5

如果您使用的是 Rails(它实际上来自active_support),每个对象都会有一个try方法,该方法也可以执行您想要的操作:

user_name = Rails.application.config.try(:user)
Run Code Online (Sandbox Code Playgroud)

ruby 2.3 给我们带来了&.

user_name = Rails.application.config&.user
Run Code Online (Sandbox Code Playgroud)

请注意,在这两种情况下,您都可以隐式使用返回值 ifnil不应该是有效的 user_name (因为try和如果不响应&.则返回 nil ):configuser

user_name = Rails.application.config&.user || 'Guest' # ruby >= 2.3.0
user_name = Rails.application.config.try(:user) || 'Guest'
Run Code Online (Sandbox Code Playgroud)

如果您调用该代码段两次以上(我的经验法则),您应该考虑将其提取到自己的方法中,例如Application#user_name.

更正

事后想来,我认为这&.可能不会按预期工作,因为config可能不是零。这实际上取决于设置(已user配置,但为空?如何config实现?)。我保留了答案的这一部分,因为它可能对相关问题感兴趣(但请记住:您需要 ruby​​ 2.3 或更高版本)。