我使用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
我使用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
当前回答
简单如馅饼:
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
其他回答
if params[:one] && params[:two]
... do something ...
elsif params[:one]
... do something ...
end
我是一个粉丝
params [:] .present吗?
只是因为它保持了params[sym]形式,所以更容易阅读。
如果你希望能够根据特定的缺失参数返回一个错误,而不必切换所有参数:
required_params = [:one, :two, :three]
required_params.each do |param|
if params.has_key?(param)
render json: { errors: "Missing parameter #{param.to_s}." }, :status => :bad_request
return
end
end
这是针对同一个问题拼凑出来的:
before_filter :validate_params
private
def validate_params
return head :bad_request unless params_present?
end
def params_present?
Set.new(%w(one two three)) <= (Set.new(params.keys)) &&
params.values.all?
end
第一行使用<=子集?检查目标键是否存在于参数的键中。操作符。 Enumerable.all吗?如果任何值为nil或false,则返回false。
您还可以执行以下操作:
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将修改您的哈希/参数,因此请谨慎使用。
上面的解决方案显然需要更多的工作来设置,但如果您要检查不止一个或两个参数,那么这是值得的。