Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何测试rails中是否存在参数_Ruby On Rails_Ruby - Fatal编程技术网

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

Ruby on rails 如何测试rails中是否存在参数,ruby-on-rails,ruby,Ruby On Rails,Ruby,我在RubyonRails中使用一个IF语句来尝试测试是否设置了请求参数。无论是否设置了这两个参数,都会触发以下if块的第一部分。如果同时设置了params[:one]和params[:two],如何使此部件仅被触发 if (defined? params[:one]) && (defined? params[:two]) ... do something ... elsif (defined? params[:one]) ... do something ... end

我在RubyonRails中使用一个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
您还可以使用params[:two]检查参数是否为空。是否为空

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

  • 根本没有
  • 只有
    nil
  • 只有
    false
  • 只有一个空字符串
还有。如果没有关于你具体情况的更多细节,很难说。

使用blank

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

还有。。。如果您正在测试布尔值,则这将不起作用。。自

>> false.blank?
=> true
那样的话,你可以用

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

为参数提供默认值的一种非常简单的方法:
params[:foo]| |=“默认值”

我是

params[:1]。是否存在?


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

我尝试了一个很晚的答案,但距离我们很远:

如果您想知道是否设置了(任意)散列中的值,以上所有内容都会根据其观点回答true

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

if params[:one]~=/   / and  params[:two]~=/[a-z]xy/
忽略参数(GET/POST),就好像它们没有设置一样,如果它们不符合预期

只要一个
if params[:one]
带或不带nil/true检测就是打开页面进行黑客攻击的一个步骤,因为下一步通常是使用类似
选择的东西。。。其中,参数[:one]…
,如果有意或无意,则在框架内或框架后处于活动状态


回答或提示您也可以执行以下操作:

unless params.values_at(:one, :two, :three, :four).includes?(nil)
 ... excute code ..
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
当我想检查一个或两个以上的参数时,我倾向于使用上述解决方案

.values_返回值,数组中任何未定义的参数键都用nil代替。 i、 e:

将返回以下内容:

[3,nil,5] 
.includes?(nil)然后检查数组中是否存在任何nil值。如果数组包含nil,则返回true

在某些情况下,您可能还希望检查参数是否不包含空字符串,以及假值是否为空字符串

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

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
在\u过滤器之前:验证\u参数
私有的
def验证参数
返回头:错误的请求,除非参数存在?
结束
你在场吗?

Set.new(%w(一二三))您可以更简洁地编写它,如下所示:

unless params.values_at(:one, :two, :three, :four).includes?(nil)
 ... excute code ..
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

我只是在RubyRails课堂上读到的

您可以使用
blank?
方法,该方法相当于
params[:one].nil?|参数[:1]。为空?

(例如)

我就是这么做的

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

除了前面的答案:
有_键?
有_值?
键?
值?
的形式存在。Ruby团队也使用较短的替代方法,但对于一些人来说,他们可能仍然更喜欢这些方法的较长版本

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

if params.key?(:one) && params.key?(:two)
  ... do something ...
elsif params.key?(:one)
  ... do something ...
end
注意
.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


@sawa无法传递
nil
参数。如果参数存在,它将是一个空字符串。@Jacob:不能保证在我们检查参数中的内容之前,
params
没有经过预处理。因此,我列出了一些可能需要检查的特殊情况。最好说清楚你的意思。@muistooshort我的错,那是:(在Rails 5中,params对象不再是散列,我看不到
key?
方法。@muistooshort哦,很好。我仍然有点犹豫是否使用不属于文档化API的方法,但我确信这足够安全。我现在一直在调用
params.to_h.key?
。虽然这涵盖了两个参数都被反求的情况罚款。这不包括其中一个参数的计算结果为false的情况。这不检查参数是否存在,但实际设置为nil。@但实际上,在请求头中,参数不能设置为nil。它是nil或字符串。是的,但正如其他人所说,它可能会被其他东西修改,如插件、gem或您的自己的代码,或者只是因为一些奇怪的原因无法解析。制作馅饼实际上很复杂,为什么不使用unless@Nakilon:假定
params
是一个Rails控制器方法(它恰好返回一个hashWithInferenceTaccess),它是关于Rails的。
present?
返回的是与
blank?
相反的内容。因此,如果你愿意,你可以将
if
转换为
if
if
if如果你愿意的话。@Inkling可以工作,但是内联
除非
没问题。但是,我更喜欢
if
present?
一起使用更好,3个字符更短,更简单。这是ne应该是最好的有效响应!小心使用带布尔值的present?(未定义的方法'present'表示true:TrueClass).has_key?接受的答案适用于所有类型。需要澄清的是,这在某些情况下不起作用,例如false.present?=>false,因此在通过json体传递参数时不起作用,因为它可以传递布尔值。如果在视图中使用此逻辑,present将失败,因为参数数组已被调用,并且fa
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.key?(:one) && params.key?(:two)
  ... do something ...
elsif params.key?(:one)
  ... do something ...
end
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