Rails中的日期和日期范围3

时间:2012-06-30 17:47:28

标签: ruby-on-rails-3 datetime select

我有一个带处方模型的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的值将在到期列中保存为日期时间值。

这样的事可能吗?如果是这样,怎么样?

3 个答案:

答案 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

如何做下拉?

Drop down box 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中设置时间的方式有关......