我正在使用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
对象。任何指导将不胜感激。
答案 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|
请注意变量前面的@
。这允许编辑页面使用现有对象并将其所有属性预填充到表单中。
为了在表单中显示错误,您可以使用以下代码或切换到Formtastic
或SimpleForm
之类的表单帮助程序(我建议使用后者以便更简单地使用,但这完全是意见基)。
<% @event.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
这将相应地显示所有错误。 如果您遇到其他问题,请告诉我。