How to check if params[:some][:field] is nil?

ε祈祈猫儿з 提交于 2020-01-12 05:09:09

问题


I tried code, that plused a lot of people - How to test if parameters exist in rails, but it didn't work():

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

I think, that is because of complicated params and if I write this:

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

gives me error

        can't convert Symbol into Integer

this doesn't work too:

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

gives me error:

        undefined method `[]' for nil:NilClass

It always go into else statement.

Here are my params:

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

Can someone help me ?


回答1:


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



回答2:


Cross-post answer from here:

Ruby 2.3.0 makes this very easy to do with #dig.

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

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



回答3:


I have been looking for a better solution too. I found this one:

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

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

You get the value or nil if it does not exist.

So I figured let's use try a different way:

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

It's not bad. You get nil vs. false if it's not set. You also get true if the param is set to nil.




回答4:


It would seem you need the following

    params[:report].present?

or

    params[:report].nil?

or

    params[:report].empty?

depending on what you are trying to check for




回答5:


This works to:

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

And maybe add this so you also check if it is not empty:

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


来源:https://stackoverflow.com/questions/11846227/how-to-check-if-paramssomefield-is-nil

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!