检查是否存在可选参数

时间:2017-11-20 04:00:38

标签: ruby-on-rails ruby

我有三个可选参数param1param2param3。用户可以任意组合传递任意数量的文件。

如果所有三个都通过,我可以检查param键是否存在如下:

  def index
     return unless params.key?(:param1) && params.key?(:param2) && params.key?(:param3) 
     @test = Model.where(param1: params[:param1], 
                         param2: params[:param2],
                         param3: params[:param3])
  end

但是我不想为其他条件重复相同的代码,例如只传递param1或传递param1param2或者同一个参数可以传递两次例如:

http://localhost:1000/orders?param1[]=abc&param1[]=

(传递相同param1的abc和空白值)

<ActionController::Parameters {"pram1"=>["abc", ""], "format"=>:json, "controller"=>"orders", "action"=>"index", "order"=>{}} permitted: false>

有没有更好的方法来检查这些参数的存在,所以我不必重复相同的代码?

3 个答案:

答案 0 :(得分:1)

如果要求是:

  • 仅处理名为param1param2param3的参数。
  • 即使使用相同的密钥传递多个值,也只处理第一个值。

这可能有用。

conditions = params.select {|k|
    [:param1, :param2, :param3].include? k
}.map {|k, v|
    [k, Array(v)[0]]
}.to_h
Model.where(**conditions)

答案 1 :(得分:0)

为什么不这样做?

def index
  @test = params.empty? ? Model.none : Model.where(params)
end

答案 2 :(得分:0)

尝试以下

def index
  par = params.slice(:param1, :param2, :param3).delete_if { |k, v| v.blank? }
  return if par.blank?
  Model.where(par)
end