在Rails表单对象中处理日期的最佳方法是什么

时间:2013-10-10 09:14:50

标签: ruby-on-rails ruby date activerecord

我正在使用7 Patterns to Refactor Fat ActiveRecord Models #3中描述的表单对象,目前我在存储日期方面存在问题。

这就是我所做的:

class MyModelForm
  # ...

  def initialize(my_model: MyModel.new, params: {})
    @my_model, @params = my_model, params
    @my_model.date_field_on = Date.from_params @params, "date_field_on" if @params.present?
  end
end

Date.from_params的实施方式如下:

class Date
  def self.from_params(params, field_name)
    begin
      year = params["#{ field_name }(1i)"]
      month = params["#{ field_name }(2i)"]
      day = params["#{ field_name }(3i)"]

      Date.civil year.to_i, month.to_i, day.to_i if year && month && day
    rescue ArgumentError => e
      # catch that because I don't want getting error when date cannot be parsed (invalid)
    end
  end
end

我不能只使用@my_model.assign_attributes @params.slice(*ACCEPTED_ATTRIBUTES)因为我的params["date_field_on(<n>i)"]会被跳过而且日期不会存储。

使用表单对象处理日期字段是否有更好的方法?

1 个答案:

答案 0 :(得分:1)

正如@davidfurber在评论中提到的那样,它与Virtus gem一起使用。

class MyModelForm
  include Virtus

  # ...
  attribute :date_field_on, Date

  def initialize(params: {})
    @my_model.assign_attributes params
  end
end