我有一个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属性?
答案 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