将 `if` 组合到另一个 `if` 语句中

Combine `if` inside another `if` statement

我有以下 if 声明:

if( @items.name.present? && @items.value.present?)

我想为此 if 语句添加 @items.price.blank? if @items_table[:check_price] 检查。因此,如果我的模型具有 [:check_price],我的最终 if 语句将使用 && 检查所有三个条件;否则它只会检查写入的两个条件。

您只需要在编写条件时更有创意一点:

if @items.name.present? && @items.value.present? && 
   (!@items_table[:check_price] || @items.price.blank?)

你明白为什么会这样吗?

这样写,你基本上是在说 "if the name is present and the value is present and {either I'm not supposed to check the price, or the price is blank}, then..." 这相当于你问的。

Ruby 使用惰性求值,因此只需将条件移动到开头以跳过其他检查以防错误。

if @items_table[:check_price] && @items.name.present? && @items.value.present? && @items.price.blank?

我不太确定我理解您正在尝试做什么或者您在做这件事时遇到了什么问题。但我认为这实际上会做你想做的——在 ruby '&&' 中是 "short circuit",这意味着如果前面的条件评估为假,后面的条件甚至不会评估。

if( @items.name.present? && @items.value.present? && @items_table[:check_price])

如果你真的想要两个嵌套的 if,它的工作方式如下:

    if( @items.name.present? && @items.value.present?)
      if @items_table[:check_price]
         # stuff
      end
    end

我会使用英语!这一直是我的首选编程语言:-)

    name_and_value_valid?(@items) && price_valid?(@items, @items_table)

    def name_and_value_valid?(items)
       items.name.present? && items.value.present?
    end

    def price_valid?(items, items_table)
      items.price.blank? if items_table[:check_price]
    end