当用户将表单字段留空时,在Rails 4中设置params的默认值

时间:2015-06-08 16:23:02

标签: ruby-on-rails ruby

我有一个DataPoint模型和一个表单,允许用户输入他们想要查看的数据点的年龄范围和收入范围。

在data_points_controller.rb中:

4
11
20
5

在模型data_point.rb中:

def result
    @data_points = DataPoint.select_subset(params[:min_income], params[:max_income], params[:min_age], params[:max_age])
end

当用户输入所有4个输入时,这可以正常工作:min_income,max_income,min_age和max_age。使用摘要统计信息返回正确的数据子集。

但是,当用户将4个输入中的任何一个留空时,我收到错误:

def self.select_subset(min_income, max_income, min_age, max_age)
    DataPoint.where("annual_income BETWEEN :min_income AND :max_income AND age BETWEEN :min_age AND :max_age", {min_income: min_income, max_income: max_income, min_age: min_age, max_age: max_age})
end

当用户省略特定参数时,我希望查询能够像对该特定参数没有约束一样运行。

我看了一下数据库,发现没有一个年龄在0-100之外,所以我试过了:

Computation results to 'NaN'(Not a Number)

但我仍然遇到上述错误。

即使用户没有填写所有4个表单字段,我是如何才能正常工作的?

谢谢!

2 个答案:

答案 0 :(得分:0)

  

||=设置变量的值,如果其值为“Nothing”(Ruby中为falsenil

但是,如果参数为空(""),则会将其保留为空白。

a = ""
#=> ""
a ||= "foo"
#=> ""

所以,请尝试以下方法:

def result
  params[:min_age] = "0"   if params[:min_age].blank?
  params[:max_age] = "100" if params[:max_age].blank?
  @data_points = DataPoint.select_subset(params[:min_income], params[:max_income], params[:min_age], params[:max_age])
end

blank?将涵盖nil""

答案 1 :(得分:0)

不确定是否存在所有传递的属性,您可以重写SQL查询以仅包含具有来自用户值的那些限制:

def self.select_subset(min_income, max_income, min_age, max_age)
  conditions = [].tap do |array|
    array << "annual_income >= :min_income" if min_income.present?
    array << "annual_income <= :max_income" if max_income.present?
    array << "age >= :min_age" if min_age.present?
    array << "age <= :max_age" if max_age.present?
  end

  named_params = {min_income: min_income, max_income: max_income, min_age: min_age, max_age: max_age}
  DataPoint.where(conditions.join(' AND '), named_params)
end

请注意,当用户没有选择任何限制时,您应该处理这种情况。