如何测试rails中是否存在参数

Dar*_*ren 174 ruby ruby-on-rails

我在Ruby on Rails中使用IF语句来尝试测试是否设置了请求参数.无论是否设置了两个参数,以下if块的第一部分都会被触发.如果设置了params [:one]和params [:two],我该如何才能触发此部分?

if (defined? params[:one]) && (defined? params[:two])
 ... do something ...
elsif (defined? params[:one])
 ... do something ...
end
Run Code Online (Sandbox Code Playgroud)

mu *_*ort 332

你想要has_key?:

if(params.has_key?(:one) && params.has_key?(:two))
Run Code Online (Sandbox Code Playgroud)

只是检查if(params[:one])会被一个"那里但没有"和"那里但是错误"的价值所迷惑,而你却在询问是否存在.您可能需要区分:

  • 根本不存在.
  • 但是nil.
  • 但是false.
  • 那里只有一个空字符串.

同样.如果没有更详细的确切情况,很难说.

  • @Jacob:我们无法保证在我们检查其中的内容之前,没有预先处理过"params".因此,我的可能特殊情况列表要检查.最好准确地说出你的意思恕我直言. (5认同)
  • @sawa无法传递`nil`参数.如果参数存在,则它将是一个空字符串. (3认同)
  • 在Rails 5中,params对象不再是哈希,并且我看不到key方法。http://edgeapi.rubyonrails.org/classes/ActionController/Parameters.html (2认同)
  • @muistooshort 哦,不错。我仍然有点犹豫是否使用不属于文档化 API 的方法,但我确信这足够安全。我现在一直在调用`params.to_h.key?`。 (2认同)

net*_*ate 82

我是粉丝

params[:one].present?

只是因为它保留了params[sym]表单,因此更容易阅读.

  • 小心使用礼物吗?带有布尔值(对于true:TrueClass,未定义的方法“ present”)。has_key接受的答案?适用于所有类型。 (3认同)
  • 需要明确的是,这在某些情况下不起作用,例如 false.present?=> false 所以当例如通过 json 主体传递参数时将不起作用,因为可以传递布尔值。 (2认同)

Orl*_*ndo 21

用空白?http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F

unless params[:one].blank? && params[:two].blank?
Run Code Online (Sandbox Code Playgroud)

如果它为空或零,则返回true

如果你正在测试布尔值,那将无法工作..因为

>> false.blank?
=> true
Run Code Online (Sandbox Code Playgroud)

在这种情况下你可以使用

unless params[:one].to_s.blank? && params[:two].to_s.blank?
Run Code Online (Sandbox Code Playgroud)

  • 或者`present?`返回"blank"的反义词?所以如果你愿意的话,你可以将`除非'变成'if`. (3认同)

Zac*_* Xu 13

您可以更简洁地编写它,如下所示:

required = [:one, :two, :three]
if required.all? {|k| params.has_key? k}
  # here you know params has all the keys defined in required array
else
  ...
end
Run Code Online (Sandbox Code Playgroud)


Jac*_*kin 9

馅饼简单:

if !params[:one].nil? and !params[:two].nil?
  #do something...
elsif !params[:one].nil?
  #do something else...
elsif !params[:two].nil?
  #do something extraordinary...
end
Run Code Online (Sandbox Code Playgroud)

  • 做馅饼实际上很复杂 (4认同)
  • 这不会检查参数是否存在但实际设置为nil. (3认同)

fl0*_*00r 5

if params[:one] && params[:two]
 ... do something ...
elsif params[:one]
 ... do something ...
end
Run Code Online (Sandbox Code Playgroud)


chr*_*pes 5

为params提供默认值的一种非常简单的方法: params[:foo] ||= 'default value'

  • 您也可以执行params.fetch(:foo,'default value')` (2认同)

Bas*_*ano 5

我刚刚在RubyInRails类中阅读了这篇文章 http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F

你可以使用blank?相当于的方法params[:one].nil? || params[:one].empty?

(例如)

if params[:one].blank? 
  # do something if not exist
else
  # do something if exist
end
Run Code Online (Sandbox Code Playgroud)