我是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'
我试过定义了吗?并且回应但没有效果。
任何帮助/建议表示赞赏。谢谢!
答案 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或更高版本)。