如何检查params [:some] [:field]是否为零?

时间:2012-08-07 12:40:14

标签: ruby-on-rails params null

我尝试了很多人的代码 - How to test if parameters exist in 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

它总是进入else语句。

以下是我的参数:

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

有人可以帮助我吗?

5 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:12)

来自here的交叉回答:

Ruby 2.3.0使#dig非常容易。

h = { foo: {bar: {baz: 1}}}

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

答案 2 :(得分:6)

看起来你需要以下

    params[:report].present?

    params[:report].nil?

    params[:report].empty?

取决于您要检查的内容

答案 3 :(得分:6)

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

Is there a clean way to avoid calling a method on nil in a nested params hash?

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

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

所以我想让我们以不同的方式使用try

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

这还不错。如果未设置,则会nilfalse进行比较。如果参数设置为true,您也会获得nil

答案 4 :(得分:1)

这适用于:

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

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

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