質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

293閲覧

Ruby on railsでDB接続時のエラー

yuyuyuyuddd

総合スコア8

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2018/01/29 11:23

前提・実現したいこと

Ruby on RailsでFullCalendarを使用し、予定表を作成しております。
しかし、予定表をDBから取得する際、DBに登録する際など
DBに接続する際にエラーが起き原因がわからず悪戦苦闘しております。

環境はCodeanywhereというもので以下のように作成しています。
・Ubuntu 14.04
・ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]
・Rails 4.1.6

DBに接続しようとする際に、以下のエラーが発生します。

発生している問題・エラーメッセージ

Started POST "/api/v1/events" for 103.9.96.229 at 2018-01-29 05:49:23 -0500 Processing by Api::V1::EventsController#create as JSON Parameters: {"event"=>{"title"=>"aaaaaaaaaaaa", "start"=>"2018-01-29 01:15", "end"=>"2018-02-02 12:00", "allday"=>"false"}} Completed 500 Internal Server Error in 3ms NameError (uninitialized constant Api::V1::EventsController::Event): app/controllers/api/v1/events_controller.rb:53:in `create'

該当のソースコード

JavaScript

1$(document).ready(function() { 2 3 var select = function(start, end) { 4 var title = window.prompt("予定名"); 5 start_time = start.unix() 6 var d = new Date( start_time * 1000 ); 7 var year = d.getYear() + 1900; 8 var month = d.getMonth() + 1; 9 var day = d.getDate(); 10 var hour = ( d.getHours() < 10 ) ? '0' + d.getHours() : d.getHours(); 11 var min = ( d.getMinutes() < 10 ) ? '0' + d.getMinutes() : d.getMinutes(); 12 var moment_start = year+"-"+month+"-"+day+" "+hour+":"+min; 13 start_time = moment(moment_start).add(-9, 'hour').format("YYYY-MM-DD HH:mm"); 14 end_time = end.unix() 15 d = new Date( end_time * 1000 ); 16 year = d.getYear() + 1900; 17 month = d.getMonth() + 1; 18 day = d.getDate(); 19 hour = ( d.getHours() < 10 ) ? '0' + d.getHours() : d.getHours(); 20 min = ( d.getMinutes() < 10 ) ? '0' + d.getMinutes() : d.getMinutes(); 21 moment_end = year+"-"+month+"-"+day+" "+hour+":"+min; 22 end_time = moment(moment_end).add(-9, 'hour').format("YYYY-MM-DD HH:mm"); 23 var data = { 24 event: { 25 title: title, 26 start: start_time, 27 end: end_time, 28 allday: false 29 } 30 } 31 $.ajax({ 32 type: "POST", 33 url: "/api/v1/events", 34 data: data, 35 success: function() { 36 calendar.fullCalendar('refetchEvents'); 37 } 38 }); 39 calendar.fullCalendar('unselect'); 40 }; 41 42 calendar = $('#calendar').fullCalendar({ 43 header: { 44 left: 'prev,next today', 45 center: 'title', 46 right: 'month,agendaWeek,agendaDay' 47 }, 48 axisFormat: 'H:mm', 49 timeFormat: 'H:mm', 50 monthNames: ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'], 51 monthNamesShort: ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'], 52 dayNames: ['日曜日','月曜日','火曜日','水曜日','木曜日','金曜日','土曜日'], 53 dayNamesShort: ['日','月','火','水','木','金','土'], 54 events: "/api/v1/events", 55 editable: true, // 編集可 56 selectable: true, // 選択可 57 selectHelper: true, // 選択時にプレースホルダーを描画 58 ignoreTimezone: false, // 自動選択解除 59 select: select, // 選択時に関数にパラメータ引き渡す 60 buttonText: { 61 prev: '<', // &lsaquo; 62 next: '>', // &rsaquo; 63 prevYear: '<<', // &laquo; 64 nextYear: '>>', // &raquo; 65 today: '今日', 66 month: '月', 67 week: '週', 68 day: '日' 69 }, 70 height: 800, 71 defaultView: 'agendaWeek', 72 eventLimit: true, 73 firstDay: 0, 74 weekends: true, 75 weekMode: 'fixed', 76 weekNumbers: false, 77 slotDuration: '00:30:00', 78 snapDuration: '00:15:00', 79 minTime: "00:00:00", 80 maxTime: "24:00:00", 81 defaultTimedEventDuration: '10:00:00', 82 allDaySlot: false, 83 allDayText:'allday', 84 slotMinutes: 15, 85 snapMinutes: 15, 86 firstHour: 9, 87 eventClick: function(event) { 88 var id = event.id 89 var show_url = "/events/"+id 90 location.href = show_url; 91 }, 92 eventResize: function(event) { 93 var id = event.id 94 var update_url = "/api/v1/events/"+id 95 var event_start_time = event._start._d 96 var year = event_start_time.getYear() + 1900; 97 var month = event_start_time.getMonth() + 1; 98 var day = event_start_time.getDate(); 99 var hour = ( event_start_time.getHours() < 10 ) ? '0' + event_start_time.getHours() : event_start_time.getHours(); 100 var min = ( event_start_time.getMinutes() < 10 ) ? '0' + event_start_time.getMinutes() : event_start_time.getMinutes(); 101 var moment_start = year+"-"+month+"-"+day+" "+hour+":"+min; 102 var start_time = moment(moment_start).add(-9, 'hour').format("YYYY-MM-DD HH:mm"); 103 var event_end_time = event._end._d 104 var year = event_end_time.getYear() + 1900; 105 var month = event_end_time.getMonth() + 1; 106 var day = event_end_time.getDate(); 107 var hour = ( event_end_time.getHours() < 10 ) ? '0' + event_end_time.getHours() : event_end_time.getHours(); 108 var min = ( event_end_time.getMinutes() < 10 ) ? '0' + event_end_time.getMinutes() : event_end_time.getMinutes(); 109 var moment_end = year+"-"+month+"-"+day+" "+hour+":"+min; 110 var end_time = moment(moment_end).add(-9, 'hour').format("YYYY-MM-DD HH:mm"); 111 var data = { 112 event: { 113 title: event.title, 114 start: start_time, 115 end: end_time, 116 allday: false 117 } 118 } 119 $.ajax({ 120 type: "PATCH", 121 url: update_url, 122 data: data, 123 success: function() { 124 calendar.fullCalendar('refetchEvents'); 125 } 126 }); 127 calendar.fullCalendar('unselect'); 128 }, 129 eventDrop: function(event) { 130 var id = event.id 131 var update_url = "/api/v1/events/"+id 132 var event_start_time = event._start._d 133 var year = event_start_time.getYear() + 1900; 134 var month = event_start_time.getMonth() + 1; 135 var day = event_start_time.getDate(); 136 var hour = ( event_start_time.getHours() < 10 ) ? '0' + event_start_time.getHours() : event_start_time.getHours(); 137 var min = ( event_start_time.getMinutes() < 10 ) ? '0' + event_start_time.getMinutes() : event_start_time.getMinutes(); 138 var moment_start = year+"-"+month+"-"+day+" "+hour+":"+min; 139 var start_time = moment(moment_start).add(-9, 'hour').format("YYYY-MM-DD HH:mm"); 140 var event_end_time = event._end._d 141 var year = event_end_time.getYear() + 1900; 142 var month = event_end_time.getMonth() + 1; 143 var day = event_end_time.getDate(); 144 var hour = ( event_end_time.getHours() < 10 ) ? '0' + event_end_time.getHours() : event_end_time.getHours(); 145 var min = ( event_end_time.getMinutes() < 10 ) ? '0' + event_end_time.getMinutes() : event_end_time.getMinutes(); 146 var moment_end = year+"-"+month+"-"+day+" "+hour+":"+min; 147 var end_time = moment(moment_end).add(-9, 'hour').format("YYYY-MM-DD HH:mm"); 148 var data = { 149 event: { 150 title: event.title, 151 start: start_time, 152 end: end_time, 153 allday: false 154 } 155 } 156 $.ajax({ 157 type: "PATCH", 158 url: update_url, 159 data: data, 160 success: function() { 161 calendar.fullCalendar('refetchEvents'); 162 } 163 }); 164 calendar.fullCalendar('unselect'); 165 } 166 }); 167});
コントローラー require "#{Rails.root}/app/controllers/application_controller.rb" module Api module V1 class EventsController < ApplicationController # CSRF対策 protect_from_forgery except: [:create, :update] def index @events = Event.order(:id).limit(params[:limit]).offset(params[:offset]) json = @events render json: json.to_json end def show @event = Event.find(params[:id]) render json: @event.to_json end def edit @event = Event.find(params[:id]) end def update @event = Event.find(params[:id]) event_params.require(:title) event_params.require(:start) event_params.require(:end) # event_params.require(:color) # event_params.require(:allday) respond_to do |format| format.any if @event.update!(event_params) @event.save render json: @event.to_json else render json: {status: "ng", code: 500, content: {message: "エラーだよ"}} end end end def new @event = Event.new end def create event_params.require(:title) event_params.require(:start) event_params.require(:end) # event_params.require(:color) event_params.require(:allday) @event = Event.new(event_params) respond_to do |format| format.any if @event.save! render json: @event else render json: {status: "ng", code: 500, content: {message: "エラーだよ"}} end end end def destroy @event = Event.find(params[:id]) @event.destroy render json: @event end private def event_params params[:event] .permit( :title, :start, :end, :color, :allday ) end end end end

試したこと

エラー内容を調査しましたが、よくわかりませんでした。

補足情報(FW/ツールのバージョンなど)

参考にしたサイト(というよりほぼ真似をして作成しております)
https://qiita.com/ShoutaWATANABE/items/3d0cddafadb4f275991e

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

秒のデータがいるのでは?

start_time = moment(moment_start).add(-9, 'hour').format("YYYY-MM-DD HH:mm");

start_time = moment(moment_start).add(-9, 'hour').format("YYYY-MM-DD HH:mm:00");
end_time = moment(moment_end).add(-9, 'hour').format("YYYY-MM-DD HH:mm");

end_time = moment(moment_end).add(-9, 'hour').format("YYYY-MM-DD HH:mm:00");

投稿2018/01/29 11:40

apo

総合スコア349

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuyuyuyuddd

2018/01/30 01:43

ご協力ありがとうございました!
guest

0

自己解決

コントローラの
Event→Events

renderの最後に and return を付けることで解決いたしました。

ありがとうございました。

投稿2018/01/30 01:43

yuyuyuyuddd

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問