Подтвердить что ты не робот

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

Я хотел бы упростить код, удалив его без инструкции. Как я могу это сделать?

4b9b3361

Ответ 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 с чем-либо более сложным (содержит или/и), слишком сложно рассуждать о таком утверждении.