目前我们正在处理用户输入的时间。
我们希望将输入作为字符串输入,这对用户来说是最自然的 恩。 12:30,1:30。
请注意,时间不是基于特定日期,而是基于一天中的某个时间。
然而,在我们的模型中,我们希望将实际时间存储为整数(午夜后的秒数)。我们需要它作为整数来进行某些约束检查,什么不是。我们也很容易再次使用
输出一个漂亮的字符串Time.at().utc.strftime("%I:%M%p")
我们遇到的问题是我们希望用户使用正则表达式验证字符串输入,然后将其转换为午夜后的秒并存储它。 然而,似乎在我们的模型validates_by_format之前,该字段已经被转换为某种整数类型。关于如何在转换之前使用正则表达式检查用户输入并将其存储为整数(午夜后几秒)的任何想法?
以下是我们的一些代码片段:
模型验证
validates_format_of :start_time, :with => /\A(1[0-2]|[1-9]):[0-5][0-9]\z/, :message => "Must be valid time format"
我们表格中的字段
start_time :integer
end_time :integer
控制器功能
def create
@course_offering = current_term.course_offerings.new(params[:course_offering])
if @course_offering.save
#flash[:success] = "Offering created"
@conflicts = conflicts(@course_offering)
render :show
else
render :new
end
end
新视图
<% form_for @course_offering do |f| %>
<!-- other fields above this -->
<p>
<%= f.label :start_time %><br>
<%= f.text_field :start_time %>
</p>
<p>
<%= f.label :end_time %><br>
<%= f.text_field :end_time %>
</p>
<% end %>
答案 0 :(得分:1)
我会使用自定义验证方法来检查是否可以将用户输入解析为有效时间,如模型中的这样:
validate :user_must_enter_valid_time
def user_must_enter_valid_time
errors.add(:start_time, "Incorrect format of start time") if
!valid_time?(start_time)
end
def valid_time?(time_string)
begin
parsed_input = Time.parse(time_string)
#Checking if user entered time no earlier than 24 hours before current time
return Time.now - parsed_input < 24 * 60 * 60
rescue Exception => e
return false
end
end
答案 1 :(得分:1)
我们最终解决了我们的困境。我们将start_time和end_time保持为整数,但我们在模型中使用虚拟属性来获取模型中的字符串输入。
# our new fields
<p>
<%= f.label :start_time_string %><br>
<%= f.text_field :start_time_string %>
</p>
# model
def start_time_string
Time.at(start_time + 5*3600).strftime("%l:%M %p") if !start_time.nil?
end
def start_time_string=(start_time_str)
self.start_time = Time.parse(start_time_str).seconds_since_midnight
end
这样我们的用户可以输入'12:30 PM'之类的时间,但它会在午夜后保存为美好时光。