我正在使用 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/