我在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
答案 0 :(得分:0)
这是我能想到的最干净的方式,假设您不需要知道哪些元素是相同的:
我假设这些项目在数组中(或者可以很容易地转换为数组的集合)。无论如何,以某种方式将它们置于这种形式。
ary = [value1,value2,value3,value4,value5,value6,value7,value8,value9,value10]
删除空白项目。
ary.reject!(|value| value.blank?)
找出是否有比唯一元素更多的元素
if ary.length > ary.uniq.length
# Do error stuff
else
# Behave Normally
end
注意:强>
这种方法可能是干净的阅读和高度可扩展(使用这种方法的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