我在Ruby on Rails中使用IF语句来尝试测试是否设置了请求参数。无论是否设置了两个参数,都会触发以下if块的第一部分。如果同时设置了para:[:one]和params [:two],我该如何才能触发此部分?
if (defined? params[:one]) && (defined? params[:two])
... do something ...
elsif (defined? params[:one])
... do something ...
end
答案 0 :(得分:322)
您想要has_key?
:
if(params.has_key?(:one) && params.has_key?(:two))
只是检查if(params[:one])
会被“那里但是没有”和“那里但是错误”的价值所欺骗,而你会问存在。您可能需要区分:
nil
。false
。也是。如果没有更详细的确切情况,很难说。
答案 1 :(得分:79)
我是
的粉丝 params[:one].present?
仅仅因为它保留了params[sym]
形式,因此更容易阅读。
答案 2 :(得分:21)
使用空白? http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F
unless params[:one].blank? && params[:two].blank?
如果将返回true
也......如果您正在测试布尔值,那将无法工作..自
>> false.blank?
=> true
在这种情况下你可以使用
unless params[:one].to_s.blank? && params[:two].to_s.blank?
答案 3 :(得分:13)
你可以像下面这样简洁地写出来:
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
答案 4 :(得分:9)
简单如馅饼:
if !params[:one].nil? and !params[:two].nil?
#do something...
elsif !params[:one].nil?
#do something else...
elsif !params[:two].nil?
#do something extraordinary...
end
答案 5 :(得分:5)
if params[:one] && params[:two]
... do something ...
elsif params[:one]
... do something ...
end
答案 6 :(得分:5)
为您的参数提供默认值的一种非常简单的方法:params[:foo] ||= 'default value'
答案 7 :(得分:5)
我刚刚在RubyInRails类上阅读过这篇文章 http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F
您可以使用等同于blank?
params[:one].nil? || params[:one].empty?
方法
(例如)
if params[:one].blank?
# do something if not exist
else
# do something if exist
end
答案 8 :(得分:3)
您还可以执行以下操作:
unless params.values_at(:one, :two, :three, :four).includes?(nil)
... excute code ..
end
当我想查看超过一两个参数时,我倾向于使用上述解决方案。
.values_at返回并且数组为nil,代替任何未定义的param键。 即:
some_hash = {x:3, y:5}
some_hash.values_at(:x, :random, :y}
将返回以下内容:
[3,nil,5]
.includes?(nil)然后检查数组是否有任何nil值。如果数组包含nil,它将返回true。
在某些情况下,您可能还想检查params不包含并在false值上清空字符串。
您可以通过在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将修改您的哈希/参数,因此请谨慎使用。
上面的解决方案显然需要更多的工作来设置,但是如果你检查的只是一两个参数,那么它是值得的。
答案 9 :(得分:3)
除了之前的答案:has_key?
和has_value?
还有key?
和value?
形式的shorter alternatives。 Ruby团队suggests使用更短的替代方案,但对于readability,有些人可能仍然更喜欢这些方法的更长版本。
因此,在您的情况下,它将类似于
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
答案 10 :(得分:1)
为了同样的问题,将它拼凑在一起:
before_filter :validate_params
private
def validate_params
return head :bad_request unless params_present?
end
def params_present?
Set.new(%w(one two three)) <= (Set.new(params.keys)) &&
params.values.all?
end
第一行检查我们的目标键是否存在于params&#39;密钥使用&lt; = subset?运营商。 Enumerable.all?如果任何值为nil或false,则默认情况下不带阻塞返回false。
答案 11 :(得分:1)
这就是我的工作,
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
答案 12 :(得分:0)
if params[:one] && param[:two]
... excute code ..
end
您还可以使用params [:two] .empty
检查参数是否为空答案 13 :(得分:0)
我尝试了很晚,但是从远处看答案:
如果你想知道(任意)散列中的值是否已设置,以上所有答案都为真,具体取决于他们的观点。
如果你想测试你的(GET / POST ..)参数,你应该使用一些更特殊的东西,你期望它是params[:one]
的值,比如
if params[:one]~=/ / and params[:two]~=/[a-z]xy/
忽略参数(GET / POST),好像它们没有设置,如果它们不符合预期
只有if params[:one]
有或没有nil / true检测是打开页面进行黑客攻击的一个步骤,因为,如果是这样的话,通常是使用select ... where params[:one] ...
之类的内容的下一步不是,活跃的,在框架之内或之后。
答案或只是提示