2016-10-31 7 views
1

新しいMeetingを作成するajax投稿があります。保存する前にmeeting_timeという文字列をコントローラのdatetime形式に変換したい。コントローラのパラメータを取って文字列型を変換して保存する

私はこれを試してみましたが、それはまだ文字列としてmeeting_timeを保存している:

def create 

requestor = current_user 
@meeting_with_params = meeting_params 
@meeting_time = @meeting_with_params[:meeting_time] 
@meeting_time = @meeting_time.to_datetime 
@meeting_with_params[:meeting_time] = @meeting_time 
#@meeting_with_params 
@meeting = Meeting.new(@meeting_with_params) 

respond_to do |format| 
    if @meeting.save 
    format.html { redirect_to home_url, notice: 'Your lex was successfully requested! Click Plan Meeting ' } 
    format.json { render :show, status: :created, location: @meeting } 
    else 
    format.html { render :new } 
    format.json { render json: @meeting.errors, status: :unprocessable_entity } 
    end 
end 
end 

paramsを次のようになり渡されている:.jsファイル内で

Started POST "/meetings" for 127.0.0.1 at 2016-10-31 11:45:44 -0400 
Processing by MeetingsController#create as */* 
    Parameters: {"meeting"=>{"requestor_id"=>"1", "requestee_id"=>"2", "meeting_time"=>"2016-10-18 22:10:00", "accepted"=>"false", "status"=>"Active", "location"=>"Black Forest Restaurant", "location_address"=>"733 Fulton St, Brooklyn, NY 11217"}} 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT 1 [["id", 1]] 
    (0.1ms) begin transaction 
    SQL (1.1ms) INSERT INTO "meetings" ("requestor_id", "requestee_id", "meeting_time", "accepted", "location", "status", "location_address", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) [["requestor_id", 1], ["requestee_id", 2], ["meeting_time", "2016-10-18 22:10:00.000000"], ["accepted", "f"], ["location", "Black Forest Restaurant"], ["status", "Active"], ["location_address", "733 Fulton St, Brooklyn, NY 11217"], ["created_at", "2016-10-31 15:45:44.557266"], ["updated_at", "2016-10-31 15:45:44.557266"]] 

とAJAX呼び出しを:

$.ajax({ 
       url: '/meetings', 
       type: 'POST', 
       data: { 
        meeting: { 
         requestor_id: currentUserId, 
         requestee_id: requesteeId, 
         meeting_time: rubyDateTime, 
         accepted: false, 
         status: "Active", 
         location: meetingLocation, 
         location_address: meetingAddress 
        } 
       }, 
       success: function(result) { 
        createNotification(currentUserId, "Your meeting was successfully requested."); 
        location.reload(); 
       }, 
       error: function(err) { 
        console.log(err); 
       } 
      }) 

作成コントローラでmeeting_timeを引き出し、それをdatetimeに変更するにはどうすればよいですか省エネ?

ありがとうございます!

****更新 今日の日付とmeeting_timeを比較するメソッドがあるので、正しく保存されていないことを知っています。データベースに直接保存すると、経過した時間が認識されます。まったく同じ文字列を使用してPOSTで保存した場合、2つの異なるタイプを比較しているためではありません。比較ですコントローラ:

def requestor_review_meeting 
     @past_meetings = Meeting.where('meeting_time <= ? AND requestor_id= ? AND status = ? AND requestor_score < ?', DateTime.current, current_user, "Active", 1).order('meeting_time asc'); 
     render json: @past_meetings 

end 

とコンソールには:

> meeting_time 
=> Tue, 18 Oct 2016 22:10:00 UTC +00:00 
2.1.2 :012 > meeting_time.class 
=> ActiveSupport::TimeWithZone 
2.1.2 :013 > meeting_time.is_a?(DateTime) 
=> false 
2.1.2 :015 > meeting_time.is_a?(Time) 
=> true 
+0

もので 'meeting_time'のDBカラムタイプ? – Aleksey

+0

@Alekseyデータベースでは、datetimeです。しかし、私はAJAX呼び出しを通して文字列を渡すことしかできないので、現在文字列を受け取ります。保存する前にdatetimeに変換する必要があります。 – gwalshington

+0

現在のコードの問題点は何ですか? DBに文字列として保存されていることをどうやって確認しましたか? – Jayaprakash

答えて

1

あなたのコードが正常に見える、と思われます。投稿を照会してmeeting_timeを印刷しようとすると、datetimeオブジェクトになります。

更新

@Roccoで言ったように、次はRailsがのparamsから自動的に日付に日付文字列を変換するようにデータを保存するのに十分です。

def create 

requestor = current_user 
@meeting_with_params = meeting_params 
@meeting = Meeting.new(@meeting_with_params) 

respond_to do |format| 
    if @meeting.save 
    format.html { redirect_to home_url, notice: 'Your lex was successfully requested! Click Plan Meeting ' } 
    format.json { render :show, status: :created, location: @meeting } 
    else 
    format.html { render :new } 
    format.json { render json: @meeting.errors, status: :unprocessable_entity } 
    end 
end 
end 
+0

私はそれが右に貯蓄されていない理由についての詳細情報で私の質問を更新しました。(@ameting_time = Time.parse(params [:meeting_time])のように設定できます。フォーマット。ありがとう!! – gwalshington

+0

あなたの投稿を通じて、私はそれがTimeTimeではなくDateTimeであることがわかった。時間ではなくDateTimeとして正しく保存する方法を提案できますか? Merci – gwalshington

+0

Time型とDatetime型はどちらも似ています。これをチェックするhttp://stackoverflow.com/questions/1261329/whats-the-difference-between-datetime-and-time-in-ruby – Jayaprakash

1

ActiveRecordは自動的にすべての入力をキャストし、データベーススキーマと一致するようにします。だから、meeting_timeを文字列として保存しても、ロード時にdatetimeに変換されます。興味があればもっと読むことができますhere

+0

- 日付が正しいタイプとして保存されていないことをどのように知っているかについて、いくつかの情報を追加して質問を更新しました。うまくいけば、これは役立ちます:/ – gwalshington

1

datetime文字列をdatetimeに自動的に保存されるため、保存する前にdatetime文字列に変換する必要はありません。

例)

User.create('Test user', '1990-10-31 11:45:44 0000') 

は、最初のフィールドはユーザ名であり、第二の一方がDOBで検討。 2つ目はdatetimeとして自動的に解析されます。

上記「1990年10月31日に」日付 2番目の文字列'11として扱わから

最初の列:45:44' 0000時間と 3番目の文字列として扱わ 『』表すタイムゾーン

関連する問題