Rails Datetime split setter方法

时间:2009-09-09 15:28:06

标签: ruby-on-rails ruby

我在模型中有一个日期时间列,我希望将此表单显示为时间单独的text_fields而不是datetime_select帮助程序下拉菜单。

我知道我会以某种方式验证并重新创建返回数据库的日期,但我不确定如何。

我应该使用虚拟属性getter和setter方法吗? EG ...

def virtual_minute=(minute)
  ...
end

def virtual_hour=(hour)
  ...
end

或者可能在回调中?

有点卡住了!

3 个答案:

答案 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,可以分割日期和时间。

请参阅time_selectdate_select

(也可以使用:discard_day:discard_hour来使用日期时间选择...)