如何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