我使用Ruby on Rails中的IF语句来尝试和测试是否设置了请求参数。无论是否设置了两个参数,都会触发下面if块的第一部分。我怎么能让这部分只被触发,如果两个params[:one]和params[:two]都设置了?
if (defined? params[:one]) && (defined? params[:two])
... do something ...
elsif (defined? params[:one])
... do something ...
end
我使用Ruby on Rails中的IF语句来尝试和测试是否设置了请求参数。无论是否设置了两个参数,都会触发下面if块的第一部分。我怎么能让这部分只被触发,如果两个params[:one]和params[:two]都设置了?
if (defined? params[:one]) && (defined? params[:two])
... do something ...
elsif (defined? params[:one])
... do something ...
end
当前回答
if params[:one] && params[:two]
... do something ...
elsif params[:one]
... do something ...
end
其他回答
你可以这样写得更简洁:
required = [:one, :two, :three]
if required.all? {|k| params.has_key? k}
# here you know params has all the keys defined in required array
else
...
end
我是这么做的,
before_action :validate_presence
然后是以下几种方法:
def check_presence
params[:param1].present? && params[:param2].present?
end
def validate_presence
if !check_presence
render json: {
error: {
message: "Bad Request, parameters missing.",
status: 500
}
}
end
end
除了前面的答案:has_key?和has_value吗?是否有更短的密钥形式?和价值?。Ruby团队还建议使用较短的替代方法,但出于可读性考虑,有些人可能仍然更喜欢这些方法的较长版本。
因此,在你的情况下,它会像
if params.key?(:one) && params.key?(:two)
... do something ...
elsif params.key?(:one)
... do something ...
end
NB !。key ?将只检查键是否存在并忽略任何可能的值。为例:
2.3.3 :016 > a = {first: 1, second: nil, third: ''}
=> {:first=>1, :second=>nil, :third=>""}
2.3.3 :017 > puts "#{a.key?(:first)}, #{a.key?(:second)}, #{a.key?(:third), #{a.key?(:fourth)}}"
true, true, true, false
您还可以执行以下操作:
unless params.values_at(:one, :two, :three, :four).includes?(nil)
... excute code ..
end
当我想检查一个或两个以上的参数时,我倾向于使用上面的解决方案。
.values_at返回一个数组,在任何未定义的参数键的位置为nil。 即:
some_hash = {x:3, y:5}
some_hash.values_at(:x, :random, :y}
将返回以下内容:
[3,nil,5]
(nil)然后检查数组是否有nil值。如果数组中包含nil,它将返回true。
在某些情况下,你可能还想检查参数是否包含假值的空字符串。
可以通过在unless语句上方添加以下代码来处理这些值。
params.delete_if{|key,value| value.blank?}
全部加起来是这样的:
params.delete_if{|key,value| value.blank?}
unless params.values_at(:one, :two, :three, :four).includes?(nil)
... excute code ..
end
需要注意的是,delete_if将修改您的哈希/参数,因此请谨慎使用。
上面的解决方案显然需要更多的工作来设置,但如果您要检查不止一个或两个参数,那么这是值得的。
我刚在RubyInRails类上读到这个 http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F
你可以用空白?方法,该方法等价于params[:one].nil?| | params[:]空虚吗?
(如)
if params[:one].blank?
# do something if not exist
else
# do something if exist
end