Ruby除非&&声明

时间:2011-10-05 13:58:02

标签: ruby-on-rails ruby

我的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

我想通过删除一个除非语句来简化代码。我怎么能这样做?

3 个答案:

答案 0 :(得分:60)

unless something相当于if !something。在你的情况下,那将是

if !(request.subdomain.empty? && current_user.nil?)

但是,你想要

if (!request.subdomain.empty? && !current_user.nil?)

使用布尔代数(De Morgan规则),您可以将其重写为

if !(request.subdomain.empty? || current_user.nil?)

使用unless

unless request.subdomain.empty? || current_user.nil?

答案 1 :(得分:8)

如果您想将布局设置为'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,除非在最琐碎的情况下。

答案 2 :(得分:5)

使用:

if (!request.subdomain.empty? && !current_user.nil?)

我从不将unless用于任何更复杂的东西(包含或/和),这样的陈述太难以理解。