2017-05-25 22 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 

新しいイベントが作成または更新されるたびに、stringdatetimeオブジェクトに変換することが私の最終目標です。どんな指導も高く評価されます。

+0

あなたのコードをテストしたところ、うまくいきました。だから、何がうまくいかないのか、もっと多くの情報を提供してください。 –

+0

フォームを保存しようとすると、次のエラーが表示されます。 '0.1ms)BEGIN (0.1ms)ROLLBACK EventsController#テンプレートが作成されていません。レンダリングヘッド:no_content 54ms(ActiveRecord:0.2ms)のコンテンツがありません。 –

+0

これは、Railsが何をレンダリングするのか分からないためです。終わり。 'redirect_to root_path'のようなものを、レコードが正常に保存された場合は、コントローラのcreateメソッドの最後の行に追加してください。繰り返しますが、このエラーメッセージとコントローラコードを含むように質問を編集する人が多くなります。 –

答えて

0

self.datetime.to_datetimeを使用して簡単に行うことができます。

例:

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

はどこですか?モデルで? –

+0

モデルで –

+0

はい、返されているパラメータは '05/24/2017 11:02 PM'です。 '05/24/2017 11:02 PM'.to_datetime'は無効です。 –

0

よし。エラーはあなたのモデルコードではなく、フォームとコントローラメソッドであるようです。そのようなあなたの#create方法を編集してください:これはあなたの投稿のparamsでEvent -objectを作成しようとし、それを保存しようとします

def create 
    @event = Event.new(event_params) 

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

。何らかの理由で保存していない場合は、可能なすべてのエラーを出力できるnew.html.erbビューをレンダリングします。それ以外の場合は、index-pathにリダイレクトされます。

は、さらにあなたがそうのようなフォームコードを編集したい:

= form_for @event do |f| 

はあなたの変数の前に@に注意してください。これにより、編集ページは既存のオブジェクトを使用し、すべての属性をフォームにあらかじめ入力しておくことができます。

フォーム内のエラーを表示するには、次のコードを使用することができますかFormtasticまたはSimpleFormは次のようにフォームヘルパーへの切り替え(私はシンプルな使用のために、後者をお勧めしますが、それは完全に意見ベースです)。

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

これに応じてすべてのエラーが表示されます。 他にも問題がある場合は教えてください。

+0

あなたの提案では何も保存されていません。 id:nil、 名前: "p"、 場所: "p"、 date_time:nil、 workout_id:なし、 created_at:nil 、&​​lt; ActionController :: Parameters( "name" => "p"、 "location" => ");これは、 (#)> 'p"、 "date_time" => "05/27/2017 5:54 AM"}許可:true> [6] –

関連する問題