1

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

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

4

3 回答 3

3

我将提供一个示例,说明您如何使用长期 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 

如果我正确理解了您的用例,那么您可以完全摆脱日期时间选择。询问用户文本持续时间并将其分配给文本属性。然后使用chronic 从文本参数中确定时间值并将其分配给datetime 属性。为了获得额外的积分,在提交表单之前异步获取解析的时间值并将其显示在页面上,以便他们可以看到他们提交的内容是有意义的。

于 2012-07-10T01:51:45.463 回答
1

You can just do something easy like:

Time.now + 10.days

Source: How to add 10 days to current time in Rails

And how to do drop-downs?

Drop down box in Rails

Assuming the prescription is valid at the time of object creation, you can store the start date in the database as the current time Time.now (may want to convert to a datetime) and then based on the drop-down, add the amount of time until it expires like off the top of my head:

eval "Time.now + #{params[:prescription][:amount].#{params[:prescription][:time_type]}"

Hope that made sense. I would look up a better way to add the time though that maybe doesn't use eval. Heres the time reference: http://api.rubyonrails.org/classes/Time.html

于 2012-07-09T20:04:20.123 回答
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 中设置时间的方式......

于 2012-07-02T04:35:08.803 回答