如何检查params 是否为零?

我尝试了很多人的代码 – 如何测试rails中是否存在参数 ,但它不起作用():

if ( params.has_key?([:start_date]) && params.has_key?([:end_date]) ) 

我想,那是因为复杂的参数,如果我写这个:

  if ( params.has_key?([:report][:start_date]) && params.has_key?([:report][:end_date]) ) 

给我错误

  can't convert Symbol into Integer 

这也行不通:

  if ( params[:report][:start_date] && params[:report][:end_date] ) 

给我错误:

  undefined method `[]' for nil:NilClass 

它总是进入其他声明。

这是我的参数:

  report: start_date: 01/08/2012 end_date: 10/08/2012 

有人能帮我吗 ?

  if params[:report] && params[:report][:start_date] && params[:report][:end_date] 

来自这里的交叉答案:

Ruby 2.3.0使用#dig非常容易。

 h = { foo: {bar: {baz: 1}}} h.dig(:foo, :bar, :baz) #=> 1 h.dig(:foo, :zot, :baz) #=> nil 

看起来你需要以下内容

  params[:report].present? 

要么

  params[:report].nil? 

要么

  params[:report].empty? 

取决于您要检查的内容

我一直在寻找更好的解决方案。 我找到了这个:

是否有一种干净的方法可以避免在嵌套的params哈希中调用nil上的方法?

 params[:some].try(:[], :field) 

如果不存在,则获得值或nil

所以我认为让我们try一种不同的方式:

 params[:some].try(:has_key?, :field) 

不算太差。 如果没有设置,你会得到nil而不是false 。 如果param设置为nil也会得到true

这适用于:

 if params[:report].has_key?(:start_date) 

也许添加这个,所以你也检查它是否为空:

 && !params[:report][:start_date].empty?