Ruby if && statement
У меня есть следующее в моем приложении application_controller.rb
def layout
unless request.subdomain.empty? && current_user.nil?
self.class.layout 'admin'
end
end
Кажется, что код над ним не работает. Но когда я делаю следующее, он работает.
def layout
unless request.subdomain.empty?
unless current_user.nil?
self.class.layout 'admin'
end
end
end
Я хотел бы упростить код, удалив его без инструкции. Как я могу это сделать?
Ответы
Ответ 1
unless something
эквивалентен if !something
. В вашем случае это будет
if !(request.subdomain.empty? && current_user.nil?)
Однако вы хотите
if (!request.subdomain.empty? && !current_user.nil?)
Используя булевую алгебру (правило Де Моргана), вы можете переписать это на
if !(request.subdomain.empty? || current_user.nil?)
Используя unless
unless request.subdomain.empty? || current_user.nil?
Ответ 2
Если вы хотите установить макет на 'admin'
, если, субдомен не пустой и, текущий пользователь не nil:
def layout
if !request.subdomain.empty? && !current_user.nil?
self.class.layout 'admin'
end
end
Измените свою логику на использование операторов if
и положительных предикатов, это значительно облегчит понимание логики вашего кода:
def layout
if request.subdomain.present? && current_user
self.class.layout "admin"
end
end
Лучшей практикой является избегать unless
, за исключением самых тривиальных случаев.
Ответ 3
Использование:
if (!request.subdomain.empty? && !current_user.nil?)
Я никогда не использую unless
с чем-либо более сложным (содержит или/и), слишком сложно рассуждать о таком утверждении.