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

当前回答

如果你希望能够根据特定的缺失参数返回一个错误,而不必切换所有参数:

required_params = [:one, :two, :three]
required_params.each do |param|
  if params.has_key?(param)
    render json: { errors: "Missing parameter #{param.to_s}." }, :status => :bad_request 
    return
  end
end

其他回答

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

如果你希望能够根据特定的缺失参数返回一个错误,而不必切换所有参数:

required_params = [:one, :two, :three]
required_params.each do |param|
  if params.has_key?(param)
    render json: { errors: "Missing parameter #{param.to_s}." }, :status => :bad_request 
    return
  end
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

简单如馅饼:

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 [:] .present吗?

只是因为它保持了params[sym]形式,所以更容易阅读。