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

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

新規登録して質問してみよう
ただいま回答率
85.40%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

410閲覧

バリデーションを追加したがエラーメッセージが表示されない

makiharajin_74

総合スコア17

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2024/06/28 01:56

実現したいこと

学校の授業を登録するシステムで授業名等で登録時に
バリデーションを使用してユーザーが誤った情報をDBに保存されないようにする。

発生している問題・分からないこと

バリデーションを追加し、エラーを吐くような形で実装したが
エラーメッセージは表示されない。

ただ、エラーは出ている。(理由:エラーがない場合は画面遷移するが、今回はしていない)

エラーメッセージ

error

1サムネイルと授業名だけを入力したときに表示される。下記画像添付 2

該当のソースコード

CurriculumsRequest.php

1<?php 2 3namespace App\Http\Requests; 4 5use Illuminate\Foundation\Http\FormRequest; 6 7class CurriculumsRequest extends FormRequest 8{ 9 public function authorize() 10 { 11 return true; 12 } 13 14 public function rules() 15 { 16 return [ 17 'title' =>'required|max:255', 18 'description'=>'max:2000', 19 'thumbnail_image' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048', 20 21 ]; 22 } 23 public function messages() 24 { 25 return [ 26 'title.required' => '授業名は必須項目です。', 27 'title.max' => '授業名は255文字以内で入力してください。', 28 'description.max' => '授業概要は2000文字以内で入力してください。', 29 'thumbnail_image.image' => '商品画像は画像ファイルを選択してください。', 30 'thumbnail_image.mimes' => '商品画像はjpeg、png、jpg、gif形式の画像ファイルを選択してください。', 31 'thumbnail_image.max' => '商品画像のサイズは2MB以下にしてください。', 32 ]; 33 } 34} 35

CurriculumController

1public function store(CurriculumsRequest $request) 2 { 3 if (!$request->hasFile('thumbnail_image')) { 4 return '<h1>Thumbnail must be uploaded</h1>'; 5 } 6 7 $file = $request->file('thumbnail_image'); 8 9 if ($file->isValid()) { 10 $data = $this->getCurriculumData($request); 11 $data['thumbnail'] = $file->getClientOriginalName(); 12 $curriculum = Curriculum::create($data); 13 Storage::disk('public')->putFileAs('uploads/' . $curriculum->id, $file, $curriculum->thumbnail); 14 } else { 15 return '<h1>Thumbnail is invalid</h1>'; 16 } 17 return redirect()->route('curriculums.list.default'); 18 } 19private function getCurriculumData(CurriculumsRequest $request) { 20 return [ 21 'title' => $request->input('title'), 22 'description' => $request->input('description'), 23 'video_url' => $request->input('video_url'), 24 'always_delivery_flg' => $request->input('always_delivery_flg', 0), 25 'grade_id' => $request->input('grade_id'), 26 ]; 27 }

form.blade.php

1{{-- 2このform.blade.phpは、授業登録と、授業編集の両方で利用します。 3最初にform.blade.phpが登録で利用されているのか、編集で利用されているのか判定し、 4<input>にどのような値をあてはめるか決めています。 5--}} 6 7@php 8 // CurriculumControllerから渡された$curriculumがnullの場合は、『登録』とみなす。 9 $is_edit = $curriculum != null; 10 11 // 共通の変数に、登録の場合と編集の場合で異なる値をいれていく。 12 if ($is_edit) { 13 $title = $curriculum->title; 14 $video_url = $curriculum->video_url; 15 $description = $curriculum->description; 16 $always_delivery = $curriculum->always_delivery_flg ? 'checked' : ''; 17 18 $action = route('curriculums.update', [ 'id' => $curriculum->id ]); 19 $method = 'PUT'; 20 } else { 21 $title = ''; 22 $video_url = ''; 23 $description = ''; 24 $always_delivery = ''; 25 26 $action = route('curriculums.store'); 27 $method = 'POST'; 28 } 29@endphp 30 31<!DOCTYPE html> 32<html lang="ja" translate="no"> 33<head> 34 <meta charset="UTF-8"> 35 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 36 <link rel="stylesheet" href="{{ asset('css/app.css') }}"> 37 <link rel="stylesheet" href="{{ asset('css/curriculums/form.css') }}"> 38 <link rel="stylesheet" href="{{ asset('css/reset.css') }}"> 39 <title>授業設定</title> 40</head> 41<body> 42 @include('admin_header') <!-- 共通ヘッダーをインクルード --> 43 44 <div class="wrapper"> 45 46 <div class="header"> 47 <!-- 戻るボタンを押すと管理-授業一覧へ戻る形にしたい --> 48 <a class="header__back" href="{{ route('curriculums.list.default') }}">←戻る</a> 49 <h1 class="header__title">授業設定</h1> 50 </div> 51 52 <div class="content"> 53 54 <!-- 授業の詳細を書き込んでいくためのフォーム --> 55 <form action="{{ $action }}" method="POST" enctype="multipart/form-data" class="curriculum-form"> 56 @csrf 57 @if ($errors->any()) 58 <div class="alert alert-danger"> 59 <ul> 60 @foreach ($errors->all() as $error) 61 <li>{{ $error }}</li> 62 @endforeach 63 </ul> 64 </div> 65 @endif 66 @if ($is_edit) {{-- 編集の場合は、@method('PUT')を指定--}} 67 @method('PUT') 68 @endif 69 70 <!-- サムネイル変更のための箇所。プレビュー画面と、ファイル選択の<input>フィールドを用意 --> 71 <div class="curriculum-form__thumbnail-editor"> 72 <div class="preview-area"> 73 <img id="thumbnail-preview" src="{{ $is_edit ? $curriculum->getThumbnailUrl() : asset('img/noimage.jpg') }}" alt="no image" width="100%"> 74 </div> 75 <div class="curriculum-form__field curriculum-form__field--thumbnail"> 76 <label for="thumbnail_image">サムネイル</label> 77 <input type="file" name="thumbnail_image" id="thumbnail_image" accept="image/*"> 78 </div> 79 </div> 80 81 <!-- 学年のセレクトボックス --> 82 <div class="curriculum-form__field"> 83 <label for="grade_id">学年</label> 84 <select name="grade_id" id="grade_id" class="border"> 85 @foreach ($grades as $grade) 86 {{-- 編集の場合は、$curriculumに現在指定されている学年を初期値とする --}} 87 <option value="{{ $grade->id }}" {{ $is_edit && $curriculum->grade_id == $grade->id ? 'selected' : '' }}> 88 {{ $grade->name }} 89 </option> 90 @endforeach 91 </select> 92 </div> 93 94 <!-- 授業のテキストボックス --> 95 <div class="curriculum-form__field"> 96 <label for="title">授業名</label> 97 <input type="text" id="title" name="title" class="border" value="{{ $title }}"> <!-- form.blade.phpでセットした値を初期値にする。登録の場合と、編集の場合で変わる --> 98 </div> 99 100 <!-- 動画URLのテキストボックス --> 101 <div class="curriculum-form__field"> 102 <label for="video_url">動画URL</label> 103 <input type="text" id="video_url" name="video_url" class="border" value="{{ $video_url }}"> 104 </div> 105 106 <!-- 授業概要のテキストエリア --> 107 <div class="curriculum-form__field"> 108 <label for="description">授業概要</label> 109 <textarea id="description" name="description" rows="10" cols="50" class="border">{{ $description }}</textarea> 110 </div> 111 112 <!-- 常時公開のチェックボックス --> 113 <div class="curriculum-form__field curriculum-form__field--always-delivery"> 114 <input type="checkbox" id="always_delivery_flg" name="always_delivery_flg" value="1" {{ $always_delivery }}> 115 <label for="always_delivery_flg">常時公開</label> 116 </div> 117 118 <!-- 登録ボタン --> 119 <input type="submit" value="登録" class="form__register-btn bg-btn-secondary"> 120 </form> 121 </div> 122 </div> 123</body> 124 125<script type="module"> 126 import { previewOnUpload } from "{{ asset('js/curriculums/form.js') }}"; 127 128 // ファイルを選択したら、画像をプレビューするように、イベントリスナーをセット 129 previewOnUpload('#thumbnail-preview', 'input[name="thumbnail_image"]'); 130</script> 131</html> 132

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

調べてみて、
jaフォルダを入れてみたが反応せず

補足

イメージ説明
イメージ説明

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

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

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

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

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

guest

回答2

0

ベストアンサー

表示されているエラーメッセージはdescriptionはNULLが不可なので、やるべき事は
・NULLを許すテーブル定義に変更する
・NULLを渡さない
のどちらかです。

バリデーションを追加し、エラーを吐くような形で実装した

Laravelは空をnullに勝手に変換する様になったらしいので、それを見越した対応が必要でしょう。
自動変換を停止するとか、デフォルト値を使う様にするとか、入力必須(または◯文字以上)とか…
テーブル(カラム)の定義でも良いですし、バリデータで対応するのでも良いでしょう。
__Laravelに興味がないので、Laravelのバリデータ(FormRequest?)で具体的にどうするのかは知りません

バリデーションを追加したがエラーメッセージが表示されない

それは(Laravelが勝手にnullに変換する)空を許している現状のバリデーションが不適切という事でしょう。

投稿2024/06/29 00:50

編集2024/06/29 00:55
tezcello

総合スコア301

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

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

0

そういうのはDBから選択肢のリストを吐き出させセレクトボックスなどで選択させてください
「授業名」は他バイト文字で曖昧になりがちなので授業IDをを数値で持ち、
サーバーとのやり取りはIDで行うのがDBの基本です

投稿2024/06/28 02:27

編集2024/06/28 02:28
yambejp

総合スコア115870

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

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

makiharajin_74

2024/07/07 21:59

回答ありがとうございます。 ベストアンサーは別の方を選ばせていただきましたが、こちらの回答も非常に参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.40%

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

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

質問する

関連した質問