【问题标题】:Ruby on Rails check that multiple values aren't blank or equal to each otherRuby on Rails 检查多个值是否为空白或彼此不相等
【发布时间】:2016-06-04 04:32:57
【问题描述】:
我在 ruby on rails 站点中有一个表单,它接受了一堆不同的参数。如果它们不是空白,我想确保这些参数都不相等。根据表单的设计方式,这些值都不是必需的,因此其中一些可以是空白的。当然,我可以使用条件语句来做到这一点,但我想确保是否有更简洁的方法可以做到这一点,因为条件语句对于所有这些检查来说都是巨大的。同样,如果在选择这些值时(且仅在)选择这些值时,任何值彼此相等,我想返回它们不能相等的错误。这些值是由 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
【问题讨论】:
标签:
ruby-on-rails
ruby-on-rails-3
conditional
【解决方案1】:
这是我能想到的最简洁的方法,假设您不需要知道 哪些 元素是相等的:
-
我假设这些项目在一个数组中(或者一个可以轻松转换为数组的集合)。无论如何,以某种方式让它们以这种形式出现。
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 高效得多)。但是,如果您的数据不是易于数组就绪的形式(即已经在数组、散列或其他可枚举中),那么分配到数组中的成本可能不值得。
此外,如前所述,这仅返回 如果 值是共享的,而不是 哪些值 是共享的,或者 哪些变量 共享值。
此外,对于第 2 步,如果您检查 .blank? 的唯一值是 nil,您可以简单地使用 ary.compact!。
【解决方案2】:
首先,错误和表单/数据验证应该是模型层的东西。因此,您应该考虑将其移至模型上的验证,然后 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