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

skr*_*lyk 10 null ruby-on-rails params

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

     if ( params.has_key?([:start_date]) && params.has_key?([:end_date]) )
Run Code Online (Sandbox Code Playgroud)

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

       if ( params.has_key?([:report][:start_date]) && params.has_key?([:report][:end_date]) )
Run Code Online (Sandbox Code Playgroud)

给我错误

        can't convert Symbol into Integer
Run Code Online (Sandbox Code Playgroud)

这也行不通:

           if ( params[:report][:start_date] && params[:report][:end_date] )
Run Code Online (Sandbox Code Playgroud)

给我错误:

        undefined method `[]' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)

它总是进入其他声明.

这是我的参数:

    report: 
    start_date: 01/08/2012
    end_date: 10/08/2012
Run Code Online (Sandbox Code Playgroud)

有人能帮我吗 ?

Mik*_*kin 13

 if params[:report] && params[:report][:start_date] && params[:report][:end_date]
Run Code Online (Sandbox Code Playgroud)

  • 这样做有没有更简洁优雅的方式? (3认同)

ste*_*eel 12

来自这里的跨帖回答:

Ruby 2.3.0使用#dig非常容易.

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

h.dig(:foo, :bar, :baz)           #=> 1
h.dig(:foo, :zot, :baz)           #=> nil
Run Code Online (Sandbox Code Playgroud)


Dan*_*pin 7

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

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

params[:some].try(:[], :field)
Run Code Online (Sandbox Code Playgroud)

您获得该值或nil它是否不存在.

所以我认为让我们使用try不同的方式:

params[:some].try(:has_key?, :field)
Run Code Online (Sandbox Code Playgroud)

不算太差.你nilfalse,如果它没有设置.true如果param设置为,您也会得到nil.


Pur*_*gon 6

看起来你需要以下内容

    params[:report].present?
Run Code Online (Sandbox Code Playgroud)

要么

    params[:report].nil?
Run Code Online (Sandbox Code Playgroud)

要么

    params[:report].empty?
Run Code Online (Sandbox Code Playgroud)

取决于您要检查的内容