我在模型中有一个日期时间列,我希望将此表单显示为时间单独的text_fields而不是datetime_select帮助程序下拉菜单。
我知道我会以某种方式验证并重新创建返回数据库的日期,但我不确定如何。
我应该使用虚拟属性getter和setter方法吗? EG ...
def virtual_minute=(minute)
...
end
def virtual_hour=(hour)
...
end
或者可能在回调中?
有点卡住了!
答案 0 :(得分:2)
如果您使用的是ActiveRecord模型,则无需自己编写。多参数属性可以通过表单分片提交。作为一个例子,看看你不太喜欢的datetime_select方法如何工作:
http://apidock.com/rails/ActionView/Helpers/DateHelper/datetime_select
在内部,各种参数通过订单和类型信息提交,以便可以正确编码。您可以通过简单地以相同的方式命名字段来构建此功能。复制您喜欢的辅助方法并将调整后的版本放入ApplicationHelper模块中并不难。
此处的值显示为名称为:
的参数model_type[attribute(1i)]
model_type[attribute(2i)]
model_type[attribute(3i)]
这些按正确顺序组合,根据需要进行转换,并提交给特定类型属性的构造函数,例如DateTime。
这可以避免必须创建自己的包装器方法。
无论如何,创建属性的简便方法是使用attr_accessor方法,例如:
class MyModel < ActiveRecord::Base
attr_accessor :some_date
end
这将创建适当的访问器和mutator方法。
您可以使用before_validation触发器在单个传递中重新组合值,或者在日期检索方法周围编写包装器以根据需要重新构建它。
答案 1 :(得分:1)
虚拟属性是良好的IMO,因为它们将用户数据存储在实例变量中。
然后在before_save
中构造一个Time对象,将其分配给实变量。
答案 2 :(得分:0)
当我查看source code并找到:ignore_date
选项时,我试图将时间从日期开始(我认为这是你的问题):
time_select 还会为实际生成3个输入隐藏标签 年份,月份和日期,除非:ignore_date 选项设置为 真正。
如果您将:ignore_date 设置为true,则必须在表单中的同一方法上使用 date_select ,否则 异常将被提出。
换句话说,通过将其设置为true,可以分割日期和时间。
(也可以使用:discard_day
,:discard_hour
来使用日期时间选择...)