Rails 3 — Как выполнить рефакторинг этого фрагмента кода?

#ruby #ruby-on-rails-3 #refactoring

#ruby #ruby-on-rails-3 #рефакторинг

Вопрос:

Я хотел бы реорганизовать этот фрагмент кода, который совсем не СУХОЙ 🙂

 def my_method
 if session[:my_params].try(:include?, :answer)
   session[:my_params][:answer]
 elsif session[:my_params].try(:include?, :question)
   session[:my_params][:question]
 end
end
  

Есть ли способ неявно возвращать либо :answer , либо :question в зависимости от того, какой из них присутствует (если присутствует) в session[:my params] ?

Ответ №1:

Хэш будет возвращен, nil если ключ не имеет значения, связанного с ним. Поскольку nil и false оба обрабатываются одинаково в условных обозначениях, мы можем очень агрессивно сократить этот метод. if session[:my_params] Гарантирует, что session[:my_params] значение не равно нулю.

 def my_method
  session[:my_params][:answer] || session[:my_params][:question] if session[:my_params]
end
  

Комментарии:

1. Отлично, отлично работает, я должен был подумать об этом раньше 🙂

Ответ №2:

 def my_method
  session[:my_params][:answer] || session[:my_params][:question]
end
  

вернет nil , если ни то, ни другое не присутствует.

Это, конечно, предполагает, что значения [:answer] и [:question] не являются намеренно ложными, например false .

Ответ №3:

 def my_method
  h = session.fetch(:my_params, {})
  h[:answer] || h[:question]
end