Ruby on rails 如果参数为';不在场

Ruby on rails 如果参数为';不在场,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我试图创建一个函数,如果没有设置日期参数,它将返回默认值 如果参数[:开始时间]不present?returnDateTime.now如果参数[:结束时间]不present?return1.week.from\u now 我想在一个函数中保留这两个检查,但我无法使其工作。有没有更好的办法 # Main search function def self.search params, location self .join.not_booked .close_to(V

我试图创建一个函数,如果没有设置日期参数,它将返回默认值

如果参数[:开始时间]不
present?
return
DateTime.now
如果参数[:结束时间]不
present?
return
1.week.from\u 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

如果将这两种方法结合起来不是一个困难的要求,那么您可以简单方便地使用这两种不同的方法来检查
start\u time
end\u 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
然后,在主搜索函数中相应地使用它们(
开始日期(验证开始日期参数[:开始时间])
结束日期(验证结束日期参数[:结束时间])
):


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

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

如果我们将您的第二个“结束时间”检查放入一个函数中,它将始终覆盖“开始时间”中的任何可能结果。

这不是一个硬性要求。我可能只是这样做,然后继续。这样,它比用一个单一的方法来处理if/else更简单、更干净。嗯,是的,我会同意的。谢谢。@Batman这并不能真正解决你的问题。它只是用来说明在单个函数中实现您想要的功能是不可行的。除非你想返回多个对象,然后分配。我明白了,知道这个很好。我最终使用了两个函数。更简单。谢谢
def self.check param
    result = 1.week.from_now
    if param[:end_time].present?
        result = param[:end_time].to_datetime
    end
    return result
end