Rails - 在商店字段中保存日期属性

时间:2014-01-07 18:24:57

标签: ruby-on-rails

我有一个Profile类,用于存储用户的序列化配置文件信息:

class Profile < ActiveRecord::Base
  store :data, accessors: [:name, :location, :dob], coder: JSON

  belongs_to :user
end

我将日期选择器放入我的个人资料#edit form:

<%= f.input :dob, label: "Date of Birth", as: :date, order: [:month, :day, :year], include_blank: true, start_year: 1900 %>

这样可以完美呈现表单,但是当我提交时,我收到了多属性错误:

ActiveRecord::MultiparameterAssignmentErrors in ProfilesController#update
1 error(s) on assignment of multiparameter attributes [error on assignment [8, 16, 1980] to dob (undefined method `klass' for nil:NilClass)]

如何让Rails认识到:dob字段是一个日期,以便它接受multiparam属性?

2 个答案:

答案 0 :(得分:1)

我假设params是通过params[:date][1i]格式传递的。

如果是这样,在您的控制器中,在使用以下内容更新记录之前将其转换回日期字符串:

params[:dob] = Date.parse( params[:dob].to_a.sort.collect{|c| c[1]}.join("-") )

如果您在日期对象中不需要它,则可以删除Date.parse部分。

回答评论中的问题......

请注意,params[:dob]包含另一个哈希:

{ '1i'=>'2013', '2i'=>'12', '3i'=>'31' }

因此,to_a.sort将Hash转换为数组数组,并且由于无法保证Hash的顺序,sort确保它们处于预期的顺序,例如:

[['1i', '2013'], ['2i', '12'], ['3i', '31']]

然后,只需收集值并将它们与' - '连接就可以返回Date.parse接受的正确格式的字符串。在此示例中,2013-12-31

希望,这有点清除它。

答案 1 :(得分:0)

也许您需要以组件形式存储日期?

class Profile < ActiveRecord::Base
  store :data, accessors: [:name, :location, dob: [:month, :day, :year]], coder: JSON

  belongs_to :user
end