我使用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

当前回答

你可以这样写得更简洁:

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

其他回答

你想要has_key?:

if(params.has_key?(:one) && params.has_key?(:two))

只是检查if(params[:one])会被“there but nil”和“there but false”的值所愚弄,你正在询问是否存在。你可能需要区分:

根本不在那里。 只有零。 但这是假的。 这里只有一个空字符串。

也如果不了解你的具体情况,这很难说。

我是这么做的,

before_action :validate_presence

然后是以下几种方法:

    def check_presence
  params[:param1].present? && params[:param2].present?
 end

 def validate_presence
  if !check_presence
    render json:  {
                      error:  {
                                message: "Bad Request, parameters missing.",
                                status: 500
                              }
                    }
  end
 end

params[:foo] ||= '默认值'

if params[:one] && params[:two]
 ... do something ...
elsif params[:one]
 ... do something ...
end

您还可以执行以下操作:

unless params.values_at(:one, :two, :three, :four).includes?(nil)
 ... excute code ..
end 

当我想检查一个或两个以上的参数时,我倾向于使用上面的解决方案。

.values_at返回一个数组,在任何未定义的参数键的位置为nil。 即:

some_hash = {x:3, y:5}
some_hash.values_at(:x, :random, :y}

将返回以下内容:

[3,nil,5] 

(nil)然后检查数组是否有nil值。如果数组中包含nil,它将返回true。

在某些情况下,你可能还想检查参数是否包含假值的空字符串。

可以通过在unless语句上方添加以下代码来处理这些值。

params.delete_if{|key,value| value.blank?}

全部加起来是这样的:

 params.delete_if{|key,value| value.blank?}
 unless params.values_at(:one, :two, :three, :four).includes?(nil)
   ... excute code ..
  end

需要注意的是,delete_if将修改您的哈希/参数,因此请谨慎使用。

上面的解决方案显然需要更多的工作来设置,但如果您要检查不止一个或两个参数,那么这是值得的。