我有一个日历系统,用户可以在单独的text_field中输入事件的日期和时间。我将日期和时间存储在事件模型中的一个属性(开始)中我很难确定如何组合日期和时间输入并将其组合到begin属性中。
我最好通过虚拟属性(:date
和:time
)来实现这一点,这样我就可以轻松地将我的表单映射到这些虚拟属性,而无需在控制器中执行某些操作。
非常感谢
答案 0 :(得分:10)
您可以为日期和时间属性创建自己的访问器方法,如下所示:
def date
datetime.to_date
end
def date=(d)
original = datetime
self.datetime = DateTime.new(d.year, d.month, d.day,
original.hour, original.min, original.sec)
end
def time
datetime.to_time
end
def time=(t)
original = datetime
self.datetime = DateTime.new(original.year, original.month, original.day,
t.hour, t.min, t.sec)
end
答案 1 :(得分:1)
您应该使用before_validation callback将来自两个虚拟属性的数据合并为一个真实属性。例如,像这样:
before_validation(:on => :create) do
self.begin = date + time
end
date + time
将是两个值的组合逻辑。
然后你应该编写一些attr_accessor方法来获取必要的单个值。哪个会进行拆分并返回适当的值。
答案 2 :(得分:1)
我认为您的模型中有一个日期时间字段,rails允许您在表单中轻松地读取日期部分和时间部分(轻松),然后将它们轻松地组合到一个日期时间字段中。如果您的属性是日期时间,则此功能特别有用。
# model post.rb
attr_accessible :published_on # just added here to show you that it's accessible
# form
<%= form_for(@post) do |f| %>
<%= f.date_select :published_on %>
<%= f.time_select :published_on, :ignore_date => true %>
<% end %>
日期选择行将为您提供published_on的日期部分 时间选择行将为您提供published_on的时间部分。 :ignore_date =&gt; true将确保时间选择不输出与published_at相关的3个隐藏字段,因为您已在上一行中读取它们。
在服务器端,将合并日期和时间字段!
如果您正在以text_box的身份阅读日期,那么此解决方案不幸地无法正常工作。由于您没有使用rails为日期时间内置的rails提供的复合属性。
简而言之,如果您使用date_select,time_select,rails可以轻松实现,否则您可以自由寻找其他选项。
答案 3 :(得分:0)
您应该使用开源日期时间选择器窗口小部件来为您处理此问题,而不是将字段自己设置为文本字段。