如何testingrails中是否存在参数
我在Ruby on Rails中使用IF语句来尝试和testing是否设置了请求参数。 无论是否设置了这两个参数,下面if块的第一部分都被触发。 如何设置params [:one]和params [:two]?
if (defined? params[:one]) && (defined? params[:two]) ... do something ... elsif (defined? params[:one]) ... do something ... end
你想要has_key?
:
if(params.has_key?(:one) && params.has_key?(:two))
只要检查if(params[:one])
是否会被“有,但无”和“有但是假”的价值所愚弄,并且你在问存在。 您可能需要区分:
- 根本就没有。
- 有但
nil
。 - 那里但是
false
。 - 只有一个空的string。
以及。 很难说没有你的确切情况的更多细节。
我是一个粉丝
params[:one].present?
只是因为它保持params [sym]forms,所以它更容易阅读。
使用空白? http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F
unless params[:one].blank? && params[:two].blank?
将返回true,如果它为空或零
也…这不会工作,如果你正在testing布尔值..自
>> false.blank? => true
在这种情况下,你可以使用
unless params[:one].to_s.blank? && params[:two].to_s.blank?
馅饼简单:
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
你可以写得更简洁,如下所示:
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
给params提供默认值的一个非常简单的方法: params[:foo] ||= 'default value'
if params[:one] && params[:two] ... do something ... elsif params[:one] ... do something ... end
我刚刚阅读了RubyInRails类http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F
你可以使用blank?
方法相当于params[:one].nil? || params[:one].empty?
params[:one].nil? || params[:one].empty?
(例如)
if params[:one].blank? # do something if not exist else # do something if exist end
您还可以执行以下操作:
unless params.values_at(:one, :two, :three, :four).includes?(nil) ... excute code .. end
当我想要检查更多的一个或两个参数时,我倾向于使用上面的解决scheme。
.values_at返回并用nil代替任何未定义的参数键。 即:
some_hash = {x:3, y:5} some_hash.values_at(:x, :random, :y}
将返回以下内容:
[3,nil,5]
.includes?(nil)然后检查数组是否有任何nil值。 这将返回true是数组包括零。
在某些情况下,您可能还想检查参数是否包含空值string和错误的值。
您可以通过在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将会修改你的hash / params,所以请谨慎使用。
上面的解决scheme显然需要更多的工作来设置,但是如果你检查更多,然后只是一个或两个参数值得。
这就是我所做的,
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
if params[:one] && param[:two] ... excute code .. end
您也可以使用params [:two] .empty来检查参数是否为空
我试了一晚,但是从远方来看答案:
如果你想知道(任何)哈希值是否被设置,上面的所有答案都是正确的,这取决于他们的观点。
如果你想testing你的(GET / POST ..)参数,你应该使用一些比较特殊的东西来表示params[:one]
的值,像
if params[:one]~=/ / and params[:two]~=/[az]xy/
忽略参数(GET / POST)就好像他们没有设置,如果他们不符合预期
只是一个if params[:one]
有或没有零/真正的检测是打开你的网页的黑客一步,因为,这是典型的下一步使用像select ... where params[:one] ...
,如果这是有意或无意,活跃或框架内或之后。
一个答案或只是一个提示
刚刚拼凑在一起为同样的问题:
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的键中? 运营商。 Enumerable.all? 如果任何值为零或为假,则默认情况下不返回块。
除了以前的答案: has_key?
和has_value?
在key?
forms有更短的select key?
和value?
。 Ruby团队也build议使用更短的替代scheme,但为了便于阅读,有些人可能更喜欢这些方法的更长版本。
所以在你的情况下,会是这样的
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