我有一个带处方模型的Rails 3应用程序。该模型有许多字段,其中两个用于计算和显示处方的持续时间。
用户在文本字段(例如“3个月”)中输入值,然后手动将日期时间输入更改为从现在开始的三个月。这似乎是一种为用户自动化的完美形式。
目前字段是这样的:
治疗持续时间
<%= f.text_field :duration, :class => "input-text" %>
到期日
<%= f.datetime_select :expiry, :order => [:day, :month, :year], :class => "input-text" %>
所以,我的问题。如何为持续时间字段创建两个下拉列表,例如:
[1] [Day]
用户可以从第一个列表中选择号码,在第二个列表中他们可以选择日,周或月。
他们使用持续时间选择框选择的值将保存为文本字符串,例如“1个月”,1个月内Time.now的值将在到期列中保存为日期时间值。
这样的事可能吗?如果是这样,怎么样?
答案 0 :(得分:3)
我将提供一个如何使用chronic gem的示例,因为它似乎是为此目的而量身定做的:
require 'chronic'
duration = "3 months" # => "3 months"
Time.now # => 2012-07-09 18:43:50 -0700
Chronic.parse(duration + " from now") # => 2012-10-09 18:43:55 -0700
如果我正确理解了您的用例,那么您可以完全摆脱日期时间选择。询问用户文本持续时间并将其分配给text属性。然后使用chronic从text参数中确定时间值并将其分配给datetime属性。要获得额外的信用,请异步获取解析的时间值,并在提交表单之前将其显示在页面上,以便他们可以看到他们提交的内容是有意义的。
答案 1 :(得分:1)
你可以做一些简单的事情:
Time.now + 10.days
来源:How to add 10 days to current time in Rails
如何做下拉?
假设处方在对象创建时有效,您可以将开始日期存储在数据库中作为当前时间Time.now(可能希望转换为日期时间),然后根据下拉列表,添加直到它过期的时间就像我的头顶一样:
eval "Time.now + #{params[:prescription][:amount].#{params[:prescription][:time_type]}"
希望有道理。我会查找一个更好的方法来添加时间虽然可能不使用eval。下面是时间参考:http://api.rubyonrails.org/classes/Time.html
答案 2 :(得分:0)
首先,将持续时间字段更改为1-30的选择菜单,或任何您想要的数字。
然后在处理表单的控制器操作中:
@prescription = Prescription.new(params[:prescrption])
@prescription.duration = "#{pluralize(params[:prescription][:duration], params[:prescription][:expiry])}"
if params[:prescription][:expiry] == "Day"
@prescription.expiry = Time.now + params[:prescription][:duration].days
elsif params[:prescription][:expiry] == "Week"
# Put week logic here
elsif params[:prescription][:expiry] == "Month"
# Put month logic here
end
# Put the rest of the @prescription.save stuff here.
这有点冗长,但我认为这与Ruby中设置时间的方式有关......