在Ruby方法中" def初始化(params)"什么" params || = {}"做?

时间:2015-02-18 01:53:24

标签: ruby-on-rails ruby methods initialization arguments

我在Rails模型中有这个" InvoiceSearch":

class InvoiceSearch
  attr_reader :date_from, :date_to

 def initialize(params)
    params||={}
    @date_from = parsed_date(params[:date_from], 7.days.ago.to_date.to_s)
    @date_to = parsed_date(params[:date_to], Date.today.to_s)
  end

我在做什么params||={}

什么是

@date_to = parsed_date(params[:date_to], Date.today.to_s)"

完全正确吗?

' parsed_date'的定义:

private
  def parsed_date(date_string, default)
    Date.parse(date_string)
  rescue ArgumentError, TypeError
    default
  end
end

1 个答案:

答案 0 :(得分:0)

因此params ||= {}相当于params = params || {}。在Ruby nil被认为是假的。因此,如果paramsnil(或false),则会将其设置为{}。这在以下代码中非常重要,因为如果paramsnil,那么params[:date_from]将导致错误。但如果params为空哈希,即{},则params[:date_from]将返回nil,并且不会导致错误。

根据parsed_date的定义,它将尝试解析date_string,但如果date_string为零或无效日期(例如Feb 30, 2015),则会引发错误。 rescue ArgumentError, TypeError会处理这些错误,并会返回default

如果您的计划希望@date_from@date_to成为Date个对象,那么您的通话不应包含.to_s default,因为这会导致@date_from要设置为字符串,例如"Wed, 18 Feb 2015"而不是与今天相对应的实际Date对象。

总而言之,行@date_to = parsed_date(params[:date_to], Date.today.to_s)将尝试解析参数date_to给出的日期并将其转换为Date对象,但如果参数不是{t}指定的(所以params[:date_to]nil),它是false或它是无效的日期,然后@date_to将被分配到默认值,在您的情况下,字符串今天的约会。