2017-05-25 47 views
0

我正在使用bootstrap3 datetimepicker。當用戶選擇一個日期時,它會返回一個字符串。我不知道如何將數據類型更改爲datetime對象。我認爲歸檔此任務的最佳方式是使用回調before_save。當我執行我的方法時,我得到以下錯誤。RoR DateTimePicker將字符串轉換爲DateTime對象

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

當我嘗試保存表單時出現以下錯誤。 '0.1ms)BEGIN (0.1ms)ROLLBACK 未找到爲EventsController創建的模板#create,rendering head:no_content 已完成204 54ms內沒有內容(ActiveRecord:0.2ms)' –

+0

這是因爲Rails不知道要渲染什麼結束。如果記錄被成功保存,則添加類似'redirect_to root_path'的東西,作爲控制器的最後一行創建方法。再次,它會幫助你很多人編輯你的問題,包括這個錯誤信息和控制器代碼。 –

回答

0

您可以簡單地使用self.datetime.to_datetime來做到這一點。

實施例:

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

那裏?在模型中? –

+0

yes在模型 –

+0

中,但是返回的參數是'05/24/2017 11:02 PM''2017/5/14 11:02 '. to_datetime'返回無效 –

0

好的。錯誤似乎不是你的Model代碼,而是形式和控制器方法。請編輯您的#create方法,像這樣:

def create 
    @event = Event.new(event_params) 

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

這將嘗試與您發佈PARAMS創建Event -object,並試圖將其保存。如果由於某種原因它沒有保存,它會呈現new.html.erb視圖,您可以在其中輸出所有可能的錯誤。否則,它會重定向到索引路徑。

而且要編輯像這樣表單代碼:

= form_for @event do |f| 

注意@在變量前面。這允許編輯頁面使用現有對象並將其所有屬性預填充到表單中。

爲了在您的表單中顯示錯誤,您可以使用下面的代碼或切換到一個形式助手,如FormtasticSimpleForm(我建議後者更簡單的使用,但這完全是基於意見的)。

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

這將顯示所有相應的錯誤。 讓我知道你是否遇到其他問題。

+0

隨着您的建議,沒有任何東西是保存。我在'pry'中注意到這個日期不是在'@ event'下保存的id:nil , updated_at:nil' 但它在參數'[5] pry(#)> event_params =>「p」,「location」=> 「#」,「date_time」=>「05/27/2017 5:54 AM」}允許:true> [6] pry(#)> –

相關問題