RoR DateTimePicker将String转换为DateTime对象

时间:2017-05-25 02:39:48

标签: ruby-on-rails

我正在使用bootstrap3 datetimepicker。当用户选择日期时,它返回一个字符串。我无法弄清楚如何将数据类型更改为datetime对象。我认为归档此任务的最佳方法是使用回调before_save。当我实现我的方法时,我得到以下错误。

Processing by EventsController#create as HTML
Parameters: {"utf8"=>"✓","authenticity_token"=>"FSSSA==", 
"event"=>{"name"=>"Omaha", "location"=>"Omaha", "date_time"=>"05/24/2017 9:04 PM"}, 
"commit"=>"Save"}
(0.1ms)  BEGIN
(0.1ms)  ROLLBACK
No template found for EventsController#create, rendering head :no_content
Completed 204 No Content in 54ms (ActiveRecord: 0.2ms)

Event.rb

class Event < ApplicationRecord
  validates :name, :date_time, :location, presence: true
  before_save :parse_date_time
  private

  def parse_date_time
    self.date_time = DateTime.strptime(date_time, "%m/%d/%Y %l:%M %p")
  end
end

活动视图:

= form_for event do |f|
 .form-group
= f.label :name, 'Event Name:'
 .text
  = f.text_field  :name, class: 'form-control', placeholder: 'Add Your  Event Name Here'

 .form-group
= f.label :location
 .text
  = f.text_field :location, class: 'form-control', placeholder: 'Location or Venue Name'

 .form-group
= f.label :date_time
 .text
  = f.text_field :date_time, class: 'form-control', id: 'datetimepicker', placeholder: 'Date and Event Start Time'

= f.submit'保存'

控制器

class EventsController < ApplicationController

 def index
  @events = Event.all
 end

 def new
  @event = Event.new
 end

 def create
  @event = Event.new(event_params)

  if @event.save
   redirect_to @events
  end
 end

 private

 def event_params
  params.require(:event).permit(:name, :location, :date_time)
 end
end

我的最终目标是每次创建或更新新事件时将string转换为datetime对象。任何指导将不胜感激。

2 个答案:

答案 0 :(得分:0)

您可以使用self.datetime.to_datetime完成此操作。

示例:

"1-1-2012".to_datetime
# => Sun, 01 Jan 2012 00:00:00 +0000

答案 1 :(得分:0)

好的。错误似乎不是您的Model代码,而是表单和控制器方法。请修改#create方法,如下所示:

  def create
    @event = Event.new(event_params)

    if @event.save
      redirect_to events_path
    else
      render 'new'
    end
  end

这将尝试使用您发布的参数创建Event - 对象并尝试保存它。如果由于某种原因它没有保存,它将呈现new.html.erb视图,您可以在其中输出所有可能的错误。否则它将重定向到索引路径。

此外,您希望像以下一样编辑表单代码:

= form_for @event do |f|

请注意变量前面的@。这允许编辑页面使用现有对象并将其所有属性预填充到表单中。

为了在表单中显示错误,您可以使用以下代码或切换到FormtasticSimpleForm之类的表单帮助程序(我建议使用后者以便更简单地使用,但这完全是意见基)。

<% @event.errors.full_messages.each do |message| %>
  <li><%= message %></li>
<% end %>

这将相应地显示所有错误。 如果您遇到其他问题,请告诉我。