在另一个`if`语句中组合`if`

时间:2015-01-26 20:25:39

标签: ruby-on-rails ruby conditional-statements

我有以下if声明:

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

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

4 个答案:

答案 0 :(得分:1)

你只需要更有创意地写下你的病情:

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

你知道为什么会这样吗?

通过这种方式写作,您基本上会说"如果名称存在且价值存在且{我不应该检查价格,或者价格是空白的然后......"这相当于你提出的问题。

答案 1 :(得分:0)

Ruby使用延迟评估,因此只需在开始时移动条件,以便在出现错误时跳过其他检查。

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

答案 2 :(得分:0)

我不太确定我明白你要做什么或者你做了什么问题。但我认为,这实际上只会做你想要的 - 在红宝石&&&'是"短路",意味着后来的条件甚至不会评估早期的评估是否为假。

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

答案 3 :(得分:0)

我会使用英语!,这总是我最喜欢的编程语言: - )

    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