如何测试参数是否存在在轨道

我使用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
224602 次浏览
if params[:one] && params[:two]
... do something ...
elsif 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] && param[:two]
... excute code ..
end

你也可以使用params[:two].empty来检查参数是否为空

你需要has_key?:

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

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

  • 根本不在那里。
  • 这里只有nil
  • 这里只有false
  • 这里只有一个空字符串。

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

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

unless params[:one].blank? && params[:two].blank?

将返回真,如果它为空或nil

也……这将不会工作,如果你是测试布尔值..自

>> false.blank?
=> true

那样的话你可以用

unless params[:one].to_s.blank? && params[:two].to_s.blank?

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

我是一个粉丝

params[:one].present?

只是因为它保留了params[sym]形式,所以更容易阅读。

我试了一个晚,但从远处回答:

如果你想知道一个(任意)散列中的值是否被设置,以上所有的答案都是true,这取决于它们的观点。

如果你想测试你的(GET/POST.)参数,你应该使用一些更特殊的东西,而不是你期望的params[:one]的值,比如

if params[:one]~=/   / and  params[:two]~=/[a-z]xy/

忽略参数(GET/POST),如果他们没有设置,如果他们不符合预期

只是一个有或没有nil/true检测的if params[:one]是打开你的页面进行黑客攻击的第一步,因为,它通常是使用类似select ... where params[:one] ...的东西的下一步,无论是否有意,活动或在框架内或之后。

一个答案或者只是一个暗示

您还可以执行以下操作:

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

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

< p >。Values_at返回一个数组,在任何未定义的参数键的位置为nil。 即:< / p >
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将修改您的哈希/参数,因此请谨慎使用。

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

这是针对同一个问题拼凑出来的:

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

你可以这样写得更简洁:

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
我刚在RubyInRails类上读到这个 http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F < / p >

你可以使用blank?方法,它等价于params[:one].nil? || params[:one].empty?

(如)

if params[:one].blank?
# do something if not exist
else
# do something if exist
end

我是这么做的,

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

除了前面的答案:has_key?has_value?短的替代品形式的key?value?。Ruby团队也使用较短的替代方法建议,但对于可读性,有些人可能仍然喜欢这些方法的较长版本。

因此,在你的情况下,它会像

if params.key?(:one) && params.key?(:two)
... do something ...
elsif params.key?(:one)
... do something ...
end

NB !.key?将只检查键是否存在,并忽略任何可能的值。为例:

2.3.3 :016 > a = {first: 1, second: nil, third: ''}
=> {:first=>1, :second=>nil, :third=>""}
2.3.3 :017 > puts "#{a.key?(:first)}, #{a.key?(:second)}, #{a.key?(:third), #{a.key?(:fourth)}}"
true, true, true, false

如果你希望能够根据特定的缺失参数返回一个错误,而不必切换所有参数:

required_params = [:one, :two, :three]
required_params.each do |param|
if params[param].blank?
render json: { errors: "Missing parameter #{param.to_s}." }, :status => :bad_request
return
end
end