2013-10-10 43 views
4

我正在使用表單對象,如7 Patterns to Refactor Fat ActiveRecord Models #3所述,目前我遇到了存儲日期問題。在Rails窗體對象中處理日期的最佳方式是什麼

這裏是我做了什麼:

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)"]將跳過該日期將不會被保存。

是否有更好的方法來處理使用表單對象的日期字段?

+0

這真的是一個很好的問題。我沒有看到幫助提取這些日期值。我發現那種奇怪! – phoet

+0

這是你在找什麼:http://stackoverflow.com/questions/13605598/how-to-get-a-date-from-date-select-or-select-date-in-rails – davidfurber

+1

我的第一個策略是將其委託給模型,因爲AR處理得很好。我的第二個策略是使用Virtus,就像在「7種模式」中的例子。 – davidfurber

回答

1

由於@davidfurber在評論中提到它與Virtus寶石很好。

class MyModelForm 
    include Virtus 

    # ... 
    attribute :date_field_on, Date 

    def initialize(params: {}) 
    @my_model.assign_attributes params 
    end 
end 
相關問題