teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

編集して詳しくしました。

2019/09/30 07:19

投稿

Yuto921
Yuto921

スコア11

title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,11 @@
1
1
  ajaxを使って、サーバー側へ処理を送ろうとすると、500番のエラーが返ってきてなかなか解決できません。
2
2
  ちなみに、Laravelで書いております。
3
3
 
4
+ 日記投稿アプリのようなものを作っています。
5
+ 現在、つまづいているところは、各投稿につけた「いいね」ボタンをajaxを使って処理するところです。
6
+ 「いいね」ボタンをクリックすると、ajaxでクリックされた投稿の「いいね」ボタンが+1され、色がつくようにしたいです。
7
+
8
+
4
9
  下が、jsファイルです。
5
10
  ```js
6
11
  $(function(){
@@ -52,7 +57,7 @@
52
57
  })
53
58
  ```
54
59
 
55
- 下が、PHPファイルです。
60
+ 下が、PHPファイル(index.blade.php)です。
56
61
  ```php
57
62
  <!-- layout.blade.phpをテンプレとして使う -->
58
63
  @extends('layouts.app')
@@ -88,6 +93,185 @@
88
93
  @endsection
89
94
  ```
90
95
 
96
+ 下は、web.phpです。ルートの記述をしています。
97
+ ```php
98
+
99
+ // 一覧以外のページはログインしていないと表示(実行)できないように変更 ログインしていない場合リダイレクト
100
+ Route::group(['middleware' => 'auth'], function() {
101
+ Route::get('diary/create', 'DiaryController@create')->name('diary.create');
102
+ Route::post('diary/create', 'DiaryController@store')->name('diary.create');
103
+
104
+ Route::get('diary/{diary}/edit', 'DiaryController@edit')->name('diary.edit');
105
+ Route::put('diary/{diary}/update', 'DiaryController@update')->name('diary.update');
106
+
107
+ Route::delete('diary/{diary}/delete', 'DiaryController@destroy')->name('diary.destroy');
108
+
109
+ Route::post('diary/{id}/like', 'DiaryController@like');
110
+ Route::post('diary/{id}/dislike', 'DiaryController@dislike');
111
+ });
112
+
113
+ Auth::routes();
114
+ ```
115
+
116
+
117
+
118
+
119
+ 下が、DiaryController.phpでコントローラーファイルです。エラー原因要因の箇所は、下のlikeメソッドです。
120
+ ```php
121
+ <?php
122
+
123
+ namespace App\Http\Controllers;
124
+
125
+ use Illuminate\Http\Request;
126
+ use App\Diary; // App は Diary.php の namespace App; からきている
127
+ use App\Http\Requests\CreateDiary; // 認証ルールを作ったRequestファイルを読み込む
128
+
129
+ class DiaryController extends Controller
130
+ {
131
+ // プロパティ
132
+
133
+ // メソッド
134
+
135
+ // 一覧表示するメソッド
136
+ public function index()
137
+ {
138
+ // diariesテーブルのデータを全件取得
139
+ // allメソッド : 全件データを取得するメソッド Modelクラスの中に入っているから使える。extendsしている
140
+ $diaries = Diary::all(); // Diary だから、 diariesのテーブルにアクセス(この場合allメソッドを)する
141
+
142
+ // dd($diaries); // var_dump + 処理をここで中断
143
+
144
+ // view('フォルダ名.ファイル名(blade.phpは除く), [配列など渡してあげたいもの]');
145
+ return view('diaries.index', [
146
+ // キー と 値で渡す (別ファイルで、キーは、$diariesで指定)
147
+ 'diaries' => $diaries
148
+ ]);
149
+ }
150
+
151
+ // 新規追加の画面を表示するメソッド
152
+ public function create()
153
+ {
154
+ return view('diaries.create');
155
+ }
156
+
157
+ // 新規追加の場面で投稿ボタンが押されたとき
158
+ // 投稿処理をするメソッド
159
+ // 引数のRequest = $_POST みたいなイメージ
160
+ public function store(CreateDiary $request)
161
+ {
162
+ // ここからデータの登録・・・投稿されたデータをdiariesテーブルに入れたい
163
+ // Diaryモデルのインスタンスを取得
164
+ $diary = new Diary();
165
+
166
+ // 画面で入力されたタイトルを代入
167
+ // 画面で渡ってきたtitle($requestに入っている)を、設定
168
+ $diary->title = $request->title;
169
+ // 画面で入力された本文を代入
170
+ $diary->body = $request->body;
171
+ $diary->user_id = \Auth::user()->id; //追加 ログインしてるユーザーのidを保存 \Auth::user() = ログインしているユーザー
172
+
173
+ // モデルからデータベースにデータを追加するとき save() = INSERT INTO
174
+ $diary->save(); // DBに保存
175
+
176
+ // 一覧ページにリダイレクト (これやらないと、戻るボタン押したとき[二重登録される]) [フォームを再送信しますか?]のアラートが出なくなる
177
+ // 戻ったときのフォームを再送信しますか?の対策のため
178
+ return redirect()->route('diary.index');
179
+ }
180
+
181
+ // 削除を実行するメソッド
182
+ public function destroy(Diary $diary) // バインディングした
183
+ {
184
+ // URLを直接入力しても表示できないようにする ログインしているユーザー != 投稿のユーザーIDと一致していなければ、
185
+ if (\Auth::user()->id !== $diary->user_id) {
186
+ abort(403);
187
+ }
188
+
189
+ // Diaryモデルのインスタンス化 しなくてもいけるべや
190
+ // $diaries = new Diary();
191
+
192
+ // Diaryモデルを使って、削除したい要素の取得
193
+ // $diary = $diaries->find($id);
194
+ // $diary = Diary::find($id);
195
+
196
+ // 取得した要素を削除
197
+ $diary->delete();
198
+
199
+ // 一覧画面に戻る
200
+ return redirect()->route('diary.index');
201
+
202
+ }
203
+
204
+ // 編集画面を表示するメソッド
205
+ // public function edit(int $id)
206
+ public function edit(Diary $diary) // $diary = Diary::find($id); 自動的に該当するモデルのインスタンスを作成
207
+ {
208
+
209
+ // URLを直接入力しても表示できないようにする ログインしているユーザー != 投稿のユーザーIDと一致していなければ、
210
+ if (\Auth::user()->id !== $diary->user_id) {
211
+ abort(403);
212
+ }
213
+
214
+
215
+ // この仕組みを、ルートモデルバインディング [バインド=縛られる・対応]
216
+
217
+ // IDをもとに1件取得 バインディングしたからいらない
218
+ // $diary = Diary::find($id);
219
+
220
+ // 編集画面を表示するとき、取得結果を渡す
221
+ return view('diaries.edit', [
222
+ 'diary' => $diary
223
+ ]);
224
+ }
225
+
226
+ // 編集処理をするメソッド
227
+ public function update(CreateDiary $request, Diary $diary) // バインディングした
228
+ {
229
+
230
+ // URLを直接入力しても表示できないようにする ログインしているユーザー != 投稿のユーザーIDと一致していなければ、
231
+ if (\Auth::user()->id !== $diary->user_id) {
232
+ abort(403);
233
+ }
234
+
235
+ // IDをもとに、投稿のタイトル、本文を更新 インスタンス化しなくても使えるということは、static function find ()
236
+ // $diary = Diary::find($id);
237
+
238
+ $diary->title = $request->title;
239
+ $diary->body = $request->body;
240
+
241
+ $diary->save(); // updateしているからデータベースで自動で、更新の日時が入る migrationファイルにtimestampがある
242
+ // 一覧ページにリダイレクト
243
+ return redirect()->route('diary.index');
244
+ }
245
+
246
+ // いいねの数
247
+ public function like(int $id)
248
+ {
249
+ $diary = Diary::where('id', $id)->with('likes')->first();
250
+ // Diaryモデルのlikesメソッド
251
+ $diary->likes()->attach(Auth::user()->id);
252
+ }
253
+
254
+ }
255
+ ```
256
+
257
+ 下は、Diary.phpでモデルファイルです。
258
+ ```php
259
+ <?php
260
+
261
+ namespace App;
262
+
263
+ use Illuminate\Database\Eloquent\Model;
264
+
265
+ class Diary extends Model
266
+ {
267
+ // リレーションを定義 linksテーブルを中間テーブルとした、多対多の関係
268
+ public function likes()
269
+ {
270
+ return $this->belongsToMany('App\User', 'likes')->withTimestamps();
271
+ }
272
+ }
273
+ ```
274
+
91
275
  > これまでにやってことは、TOKENの確認、データ(id)の受け渡しの確認。
92
276
 
93
277