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

时间:2016-08-12 03:09:10

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

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

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

config.user = 'test-user'

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

 Rails.application.config.user

给了我所需的价值。

但问题是这种配置有时可能会被禁用。所以,我想在分配之前检查是否定义了这个属性。 像

这样的东西
user_name = (if Rails.application.config.user is available)? 
             Rails.application.config.user : 'some_other_value'

我试过定义了吗?并且回应但没有效果。

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

2 个答案:

答案 0 :(得分:3)

如果在每个环境中都定义了config.user,但有时它有一个值,有时它没有,例如,它可能是nil或空字符串,可以使用present?

Rails.application.config.user.present?

如果没有定义,在上面的情况下你会得到一个NoMethodError,所以你可以拯救它:

begin
  user_name = Rails.application.config.user.present? ? Rails.application.config.user : 'some_other_value'
rescue NoMethodError
  user_name = 'some_other_value'
end

respond_to?也应该有用,只要确保不要将其与respond_to is a Rails method混淆。它可能看起来像这样:

if Rails.application.config.respond_to?(:user) && Rails.application.config.user.present?
  user_name =  Rails.application.config.user
else
  user_name = 'some_other_value'
end

答案 1 :(得分:3)

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

user_name = Rails.application.config.try(:user)

ruby​​ 2.3给我们带来了&.

user_name = Rails.application.config&.user

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

user_name = Rails.application.config&.user || 'Guest' # ruby >= 2.3.0
user_name = Rails.application.config.try(:user) || 'Guest'

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

<强>校正

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