2016-08-12 2 views
1

Я новичок в 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' 

Я попытался определить? и reply_to, но не работает.

Любая помощь/предложения приветствуются. Благодаря!

ответ

1

Если есть 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

Отлично! Это сработало. Благодаря! –

2

Если вы используете рельсы (это происходит от active_support на самом деле) каждый объект будет иметь метод try который также делает то, что вы хотите:

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

И рубин 2.3 принес нам &.:

user_name = Rails.application.config&.user 

Обратите внимание, что в обоих случаях вы можете использовать возвращаемое значение неявно, если nil РЕКОМЕНДУЕМЫМ не является действительным user_name (потому что try и &. возвратит ноль, если 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 или новее).

+0

Прохладный, спасибо за ваш ответ, я раньше не знал о 'try'. Это похоже на лучшее решение, чем само спасение исключения. – p4sh4

Смежные вопросы