如果params不存在则提供默认值

时间:2015-09-05 02:08:40

标签: ruby-on-rails ruby ruby-on-rails-4

我试图创建一个在未设置日期参数时将返回默认值的函数。

如果params [:start_time]不是present?则返回DateTime.now,如果params [:end_time]不是present?则返回1.week.from_now

我希望将这两项检查保留在一个功能中,但我无法使其正常工作。如果有更好的方法?

  # Main search function
  def self.search params, location
    self
    .join.not_booked
    .close_to(Venue.close_to(location))
    .activity(Activity.get_ids params[:activity])
    .start_date(valid_date params[:start_time])
    .endg_date(valid_date params[:end_time])
    .ordered
  end

  # Check if date is nil
  def self.valid_date date
    if date
      date.to_datetime
    elsif date == params[:start_time]
      DateTime.now
    elsif date == params[:end_time]
      1.week.from_now
    end
  end

问另一种方式:

结合这两个功能的最佳方法是什么?

  # Check if date is nil
  def self.check_start date
    date.present? ? date.to_datetime : DateTime.now
  end

  def self.check_end date
    date.present? ? date.to_datetime : 1.week.from_now
  end

2 个答案:

答案 0 :(得分:1)

如果将这两种方法结合起来并不是一项艰难的要求,您可以简单轻松地使用这两种不同的方法来检查start_timeend_time的有效性:

  def self.validate_start_date start_date
    start_date.present? ? start_date.to_datetime : DateTime.now
  end

  def self.validate_end_date end_date
    end_date.present? ? end_date.to_datetime : 1.week.from_now
  end

然后,在您的主搜索功能中相应地使用它们(start_date(validate_start_date params[:start_time])end_date(validate_end_date params[:end_time])):

  # Main search function
  def self.search params, location
    self
        .join.not_booked
        .close_to(Venue.close_to(location))
        .activity(Activity.get_ids params[:activity])
        .start_date(validate_start_date params[:start_time])
        .end_date(validate_end_date params[:end_time])
        .ordered
  end

答案 1 :(得分:0)

也许我误解了,但为什么不呢:

def self.check param
    result = 1.week.from_now
    if param[:end_time].present?
        result = param[:end_time].to_datetime
    end
    return result
end

如果我们把它放在一个函数中,你的第二个“end_time”检查将始终覆盖“start_time”的任何可能结果。