10

我尝试了代码,这增加了很多人 -如何测试 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

有人能帮我吗 ?

4

5 回答 5

13
 if params[:report] && params[:report][:start_date] && params[:report][:end_date]
于 2012-08-07T12:47:44.503 回答
12

从这里交叉发布答案:

Ruby 2.3.0 使用#dig使这变得非常容易。

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

h.dig(:foo, :bar, :baz)           #=> 1
h.dig(:foo, :zot, :baz)           #=> nil
于 2015-12-31T19:26:24.927 回答
7

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

有没有一种干净的方法可以避免在嵌套的参数哈希中调用 nil 上的方法?

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

你得到这个值,或者nil它不存在。

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

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

不算太差。如果没有设置,你会得到nilvs .。false如果true参数设置为nil.

于 2015-11-27T04:48:38.030 回答
6

看来您需要以下内容

    params[:report].present?

或者

    params[:report].nil?

或者

    params[:report].empty?

取决于您要检查的内容

于 2012-08-07T12:47:23.500 回答
1

这适用于:

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

也许添加这个,以便您还检查它是否不为空:

&& !params[:report][:start_date].empty?
于 2016-12-09T10:56:11.563 回答