Ruby on Rails检查多个值是否为空或彼此相等

时间:2016-02-22 16:34:21

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

我在rails网站上的ruby中有一个表单,它接受了许多不同的参数。我想确保这些参数不相等,如果它们不是空白的话。根据表单的设计方式,这些值都不是必需的,因此其中一些可能是空白的。当然,我可以用条件语句来做到这一点,但我想确保是否有更清晰的方法这样做,因为条件语句对于所有这些检查都是巨大的。同样,如果任何值在选择那些值时(并且仅在何时)彼此相等,我想返回它们不能相等的错误。这些值是由collection_select控件选择的,所以我没有看到任何预先过滤掉重复项的方法。是否有更简洁的方法来比较所有这些值?

if ((value1 == value2) && !value2.blank?) || 
   ((value1 == value3) && !value3.blank?) ||
   ((value1 == value4) && !value4.blank?) ||
   .... 
   ((value9 == value10) && !value10.blank?))
    Do error stuff
else
    Behave normally
end

2 个答案:

答案 0 :(得分:0)

这是我能想到的最干净的方式,假设您不需要知道哪些元素是相同的:

  1. 我假设这些项目在数组中(或者可以很容易地转换为数组的集合)。无论如何,以某种方式将它们置于这种形式。

    ary = [value1,value2,value3,value4,value5,value6,value7,value8,value9,value10]
    
  2. 删除空白项目。

    ary.reject!(|value| value.blank?)
    
  3. 找出是否有比唯一元素更多的元素

    if ary.length > ary.uniq.length
        # Do error stuff
    else
        # Behave Normally
    end
    
  4. 注意:

    这种方法可能是干净的阅读和高度可扩展(使用这种方法的100个元素的阵列比100个elsifs更有效)。但是,如果您的数据不是一个易于阵列就绪的形式(即已经存在于数组,散列或其他可枚举的形式),则分配到数组可能不值得花费。

    此外,如前所述,这只返回如果共享值,而不是共享值,或哪些变量共享值。< / p>

    此外,对于第2步,如果您要检查.blank?的唯一值为nil,则只需使用ary.compact!即可。

答案 1 :(得分:0)

首先,错误和表单/数据验证应该是模型层的东西。所以你应该考虑将它移到模型上的验证,然后ActiveRecord错误+像simple_form这样的东西会使错误提升/渲染变得轻而易举。

回到你的问题 - 你使用的是Rails 4吗?如果是这样,就像Connor所提到的那样,只需添加一些逻辑来删除permit!

中的空白参数值
class ExampleController < ApplicationController

  private
  def permitted_params
    params.require(:example).permit(:a, :b, :c).reject!(&:blank?)
  end
end

然后,您的逻辑变得更简单,您可以只比较值...此时我将添加到您的模型层

class MyModel < ActiveRecord::Base

  validate: :must_be_different

  private
  def must_be_different
    # compare value1 with value2 (take advantage of _changed? helper)
  end
end