Ruby on rails 如何测试rails中是否存在参数
我在RubyonRails中使用一个IF语句来尝试测试是否设置了请求参数。无论是否设置了这两个参数,都会触发以下if块的第一部分。如果同时设置了params[:one]和params[:two],如何使此部件仅被触发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
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
- 只有一个空字符串
>> 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