2017-10-04 54 views
0

所以一個方法,我有以下爲IF語句來檢查的折扣代碼有效性使用?在包含可變

if discount.present? && discount.usable? 

我需要通過一些額外的信息到.usable做一些額外的檢查,所以我改變它

if discount.present? && discount.usable(shopping_cart)? 

然而,軌道將引發噓聲像適合當我做到這一點 - 是有辦法一輪保持的什麼,我試圖達到的布爾結果?

這裏是可用的方法 - 我被迫刪除?在所有這些的末尾以及

def usable(shopping_cart) 
    !has_expired? && !limit_used_up? && matches_product(shopping_cart) 
end 

def matches_product(shopping_cart) 

if product_item_ids.present? 
    shopping_cart.shopping_cart_items.each do |item| 
     if !product_item_ids.include? item.item_id 
     return false 
     else 
     true 
     end 
    end 
else 
    true 
end 
+0

「#usable」的方法定義是什麼? – EJ2015

+0

@ EJ2015添加了可用的信息 –

回答

3

紅寶石約定是使用「?」在返回布爾值的方法中。但是它本身在方法定義中並不特別。這只是名稱的一部分。

你需要做的

def usable?(shopping_cart) 
    !has_expired? && !limit_used_up? && matches_product(shopping_cart) 
end 

然後就可以調用

discount.usable?(shopping_cart) 
2

如果usable?方法需要一個購物車的參數,你可以做

discount.usable?(shopping_cart) 

問號方法名稱的一部分,所以你需要把它寫出來。

更大的一點是,作爲Ruby中方法名稱的一部分,單個「?」沒有什麼特別之處。結束使用問號返回布爾值的方法是常見的風格。這使得該方法更加明顯地返回一個布爾值。但是這個問號沒有什麼合成特點。你可以很容易地有一個方法返回一個沒有它的布爾,以及一個不返回布爾的方法。 (儘管出於風格的原因,我不會推薦後者。)

在某些情況下,人們會將方法名稱別名,因此您可以使用帶有標記但沒有標記的方法。在一個接受參數並返回一個布爾值的方法中,它在某些情況下可以更好地調用它,而不用中間的問號。但是,再一次,這更多的是個人喜好。