所以我有以下作为IF语句来检查折扣代码的有效性
if discount.present? && discount.usable?
我需要将一些额外的信息传递给.usable以进行一些额外的检查,所以我将其更改为
if discount.present? && discount.usable(shopping_cart)?
然而,当我这样做时,rails会抛出一个混合物 - 有没有办法保持我想要达到的布尔结果?
这是可用的方法 - 我被迫删除?在所有这些结束时
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 :(得分:3)
红宝石惯例是使用"?"在返回布尔值的方法中。但是它本身在方法定义中并不特别。它只是名称的一部分。
你需要做
def usable?(shopping_cart)
!has_expired? && !limit_used_up? && matches_product(shopping_cart)
end
然后你可以打电话
discount.usable?(shopping_cart)
答案 1 :(得分:2)
如果usable?
方法采用购物车参数,则可以执行
discount.usable?(shopping_cart)
问号是方法名称的一部分,因此您需要将其写出来。
更重要的是,作为Ruby中方法名称的一部分,单个“?”并没有什么特别之处。结束带有问号的布尔值的方法是常见的样式。这使得该方法返回bool更加明显。但问号没有任何特殊的合成特征。你可以很容易地得到一个没有它返回bool的方法,以及一个不返回bool的方法。 (虽然出于样式原因,我不推荐后者。)
在某些情况下,人们会为方法名称添加别名,这样您就可以使用带有标记的方法,也可以没有方法。在一个接受参数并返回bool的方法中,在某些情况下,它可以看起来更好,能够在没有中间问号的情况下调用它。但同样,这更像是个人偏好而非任何事情。