我使用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

当前回答

我是这么做的,

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

其他回答

我是这么做的,

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

使用空白的?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?

除了前面的答案:has_key?和has_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

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

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

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

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

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

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

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

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

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。