2011-12-18 85 views
1

我對Ruby比較陌生(並且正在使用Rails),並且想知道是否可以整理下面的方法。在目前的狀態下它確實有效,但是我感覺有更好的方式來編寫它,並想了解更多關於語法的知識。可以整理這個紅寶石(導軌)方法嗎?

def fullAddress 
    full = self.address1 + "</br>" 
    if self.address2.blank? 
    else 
    full = full + self.address2 + "</br>" 
    end 
    if self.address3.blank? 
    else 
    full = full + self.address3 + "</br>" 
    end 
    full = full + self.posttown + "</br>" + self.postcode 
end 

每個「自我」將具有地址1,posttown和郵政編碼,地址2,但和地址3是可選的,如果它們存在(即既不爲零或空白)應該只被添加到fullAddress。

這個問題可能不適用於SO,但我遇到過這種類型的幫助方法,我確信我可以更好地實現它。

+2

如果你只有else塊你應該否定代碼'如果condition'或等值'除非condition' – tokland 2011-12-18 14:57:19

回答

12
def full_address 
    [address1, address2, address3, posttown, postcode].reject{|l| l.blank?}.join('</br>') 
end 
+2

不錯,我之前不知道拒絕(與select相反)。 – Dorian 2011-12-18 12:57:25

+2

但是這與sematics中的原始版本有很大不同,取決於數據狀態,最終可能會得到完全不同的結果。 – clyfe 2011-12-18 13:07:59

+1

或拒絕(&:空白?)或選擇(&:目前?)。或加入(tag(:br)) – tokland 2011-12-18 15:00:19

5

我的看法:

def fullAddress 
    full = [address1] 
    full << address2 unless address2.blank? 
    full << address3 unless address3.blank? 
    full << posttown << postcode 
    full.join "</br>" 
end 

self是在方法調用隱式的,有點雜耍的使用數組。

+0

好處是!你的只需要一個陣列 – maprihoda 2011-12-18 16:25:53

1
def fullAddress 
    full = address1 + "<br>" 
    full += address2 + "<br>" unless address2.blank? 
    full += address3 + "<br>" unless address3.blank? 
    full += posttown + "<br>" + postcode 
end 
0

這裏的另一種解決方案:

def full_address 
    [address1, 
    address2, 
    address3, 
    posttown, 
    postcode].inject("") do |full_addr, line| 
    full_addr << line + '<br/>' unless line.blank? 
    full_addr 
    end.chomp('</br>') 
end 

它只需要一個陣列,並立即開始構建的字符串。它應該適用於短字符串(並且完整地址是短字符串)。

1

這確實正是一樣代碼:

def full_adress 
    ([address1] + 
    [address2, address3].reject(&:blank?) + 
    [posttown, postcode] 
).join("<br/>") 
end