我尝试了很多人的代码 - 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
有人可以帮助我吗?
答案 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)
这还不错。如果未设置,则会nil
与false
进行比较。如果参数设置为true
,您也会获得nil
。
答案 4 :(得分:1)
这适用于:
if params[:report].has_key?(:start_date)
也许可以添加这个,这样你也可以检查它是否为空:
&& !params[:report][:start_date].empty?