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

其他回答

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

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。

我刚在RubyInRails类上读到这个 http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F

你可以用空白?方法,该方法等价于params[:one].nil?| | params[:]空虚吗?

(如)

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

你想要has_key?:

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

只是检查if(params[:one])会被“there but nil”和“there but 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来检查参数是否为空