ruby-on-rails - 在 Rails 表单对象中处理日期的最佳方式是什么

标签 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)"]将被跳过并且不会存储日期。

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

最佳答案

正如@davidfurber 在评论中提到的,它与 Virtus 配合得很好 gem 。

class MyModelForm
  include Virtus

  # ...
  attribute :date_field_on, Date

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

关于ruby-on-rails - 在 Rails 表单对象中处理日期的最佳方式是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19291673/

相关文章:

sql - Rails 4 查询按月和年排序

ruby - 解释 Ruby 代码片段

ruby-on-rails - 如何让Parent-Child-Parent作用域留在Parent内部?

linux - 如何在 Linux 的邮件命令中插入当前日期?

MySQL 需要在 20 年到 90 年之间的列中添加随机日期

ruby-on-rails - self.included——包含来自 Ruby 模块的类方法

html - Bootstrap 卡对齐不正确

ruby-on-rails - salt 如何在 Rails 的 has_secure_password 中工作

ruby-on-rails - Time 和 DateTime 之间的 Rails 时区差异

php - 以下哪种情况检索格式化日期的速度更快?