我使用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
当前回答
params[:foo] ||= '默认值'
其他回答
params[:foo] ||= '默认值'
你想要has_key?:
if(params.has_key?(:one) && params.has_key?(:two))
只是检查if(params[:one])会被“there but nil”和“there but false”的值所愚弄,你正在询问是否存在。你可能需要区分:
根本不在那里。 只有零。 但这是假的。 这里只有一个空字符串。
也如果不了解你的具体情况,这很难说。
你可以这样写得更简洁:
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
我试了一个晚,但从远处回答:
如果你想知道一个(任意)散列中的值是否被设置,以上所有的答案都是true,这取决于它们的观点。
如果你想测试你的(GET/POST..)参数,你应该使用一些更特殊的东西来期望params[:one]的值,比如
if params[:one]~=/ / and params[:two]~=/[a-z]xy/
忽略参数(GET/POST),如果他们没有设置,如果他们不符合预期
只是一个if params[:one]有或没有nil/true检测是打开你的页面进行黑客攻击的第一步,因为,它通常是下一步使用像select…其中params[:one]…,无论是否有意,主动或在框架内或之后。
一个答案或者只是一个暗示
除了前面的答案: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