如何测试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
    
已邀请:
你想要
has_key?
if(params.has_key?(:one) && params.has_key?(:two))
只要检查
if(params[:one])
就会被一个“那里但没有”和“那里但是错误”的价值所迷惑,而你却在询问是否存在。您可能需要区分: 根本不存在。 但是
nil
。 但是
false
。 那里只有一个空字符串。 同样。如果没有更详细的确切情况,很难说。     
我是粉丝
params[:one].present?
仅仅因为它保留了
params[sym]
形式,因此更容易阅读。     
用空白? http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F
unless params[:one].blank? && params[:two].blank?
如果它为空或零,则返回true 如果你正在测试布尔值,那将无法工作..因为
>> false.blank?
=> true
在这种情况下你可以使用
unless params[:one].to_s.blank? && params[:two].to_s.blank?
    
您可以更简洁地编写它,如下所示:
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
    
馅饼简单:
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提供默认值的一种非常简单的方法:
params[:foo] ||= 'default value'
    
我刚刚在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
    
您还可以执行以下操作:
unless params.values_at(:one, :two, :three, :four).includes?(nil)
 ... excute code ..
end 
当我想检查一个或两个以上的参数时,我倾向于使用上述解决方案。 .values_at返回和数组,其中nil代替任何未定义的param键。 即:
some_hash = {x:3, y:5}
some_hash.values_at(:x, :random, :y}
将返回以下内容:
[3,nil,5] 
.includes?(nil)然后检查数组是否有任何值。如果数组包含nil,它将返回true。 在某些情况下,您可能还需要检查params不包含并在false值上清空字符串。 您可以通过在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将修改您的hash / params,因此请谨慎使用。 上面的解决方案显然需要更多的工作来设置,但是如果你检查的只是一两个参数,那么它是值得的。     
除了之前的答案:
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
    
为了同样的问题拼凑了这个:
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
第一行使用&lt; = subset检查我们的目标键是否存在于params的键中?运营商。 Enumerable.all?如果任何值为nil或false,则每个默认值不带块返回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
    
if params[:one] && param[:two]
  ... excute code ..
end
您还可以使用params [:two] .empty检查参数是否为空     
我尝试了很晚,但从远处看答案: 如果您想知道(任意)散列中的值是否已设置,则以上所有内容均为真,这取决于他们的观点。 如果你想测试你的(GET / POST ..)参数,你应该使用一些更特殊的东西,你期望的是
params[:one]
的价值,类似于
if params[:one]~=/   / and  params[:two]~=/[a-z]xy/
忽略参数(GET / POST),好像它们没有设置,如果它们不符合预期 只有一个
if params[:one]
有或没有nil / true检测是打开你的页面进行黑客攻击的一步,因为,通常是下一步使用
select ...  where params[:one] ...
,如果这是有意或无意,有效或在框架内或之后。 答案或只是一个提示     

要回复问题请先登录注册