2011-10-05 76 views
18

我已经在我的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 

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

回答

55

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? 
+0

你是男人。很好的回答... – jaydel

8

如果您想布局设置为'admin'如果子域是当前用户零:

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除最微不足道的情况外。

4

用途:

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

我从来没有使用unless有任何比较复杂(包含或/和),它太硬来思考这样一个声明。