LoginSignup
replica410
@replica410 (陽 有村)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Laravelでのバリデーション及び、フォーム画面での書き方について

解決したいこと

プロフィール画面の編集画面(edit.blade)の作成及び、編集後にプロフィール画面(show.blade)に上手く画面移動するようにしたいです。
今、プロフィールを書き換えて保存を押すと条件をクリアしているはずがバリデーションで引っかかり警告?メッセージが出てプロフィール情報を更新出来ずに止まっています。
これを名前やコメントに文字数で書き込める条件を付けて、メールアドレスもメールアドレスの正規の形以外の入力は弾かれるようにし、登録内容を変更して保存を押した後に編集画面からプロフィール画面に戻るようにしたいです。
不慣れなので情報として足りない部分やファイルがあればご指摘ください。すぐに追記します。

発生している問題・エラー

field is required(バリデーションチェックのエラーメッセージ)、プロフィール画面に戻らない
![スクリーンショット (35).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535445/ffaccb19-1421-6f7a-3b45-9b47193e1a70.png)

該当するソースコード

laravel
web.php(ルーティング)
<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Auth::routes();

Route::get('/', function () {
    // return view('welcome');
    return view('top');
});
// 投稿一覧
// Route::get('/posts', 'PostController@index');
// // 投稿追加フォーム
// Route::get('/posts/create', 'PostController@create');
// // 投稿追加
// Route::post('/posts', 'PostController@store');
// // 投稿詳細
// Route::get('/posts/{id}', 'PostController@show');
// // 投稿更新フォーム
// Route::get('/posts/{id}/edit', 'PostController@edit');
// // 投稿更新
// Route::patch('/posts/{id}', 'PostController@update');
// // 投稿削除
// Route::delete('posts', 'PostController@destroy');

// 上記の7つのルーティングを下の一つで同じ効果にできる
// postsに関するリソースルーティングを行い、
// PostControllerの各アクションに紐づける
Route::resource('posts', 'PostController');

Route::resource('likes', 'LikeController')->only([
    'index', 'store', 'destroy'
]);
    
Route::resource('follows', 'FollowController')->only([
    'index', 'store', 'destroy'
]);

Route::get('/folloow', 'FollowController@folloowerIndex');

Route::resource('comments', 'CommentController')->only([
    'store', 'destroy'    
]);
Route::get('/posts/{post}/edit_image', 'PostController@editImage')->name('posts.edit_image');

Route::patch('/posts/{post}/edit_image', 'PostController@updateImage')->name('posts.update_image');

Route::get('/users/{id}/edit', 'UserController@edit')->name('users.edit');
Route::patch('/users/{id}', 'UserController@update')->name('users.update');
Route::get('/users/{id}/edit_image', 'UserController@editImage')->name('users.edit_image');
Route::patch('/users/{id}/edit_image', 'UserController@updateImage')->name('users.update_image');

Route::resource('users', 'UserController')->only([
  'show',
]);

UserController.php(コントローラー)
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\User;
use App\Http\Requests\UserRequest;

class UserController extends Controller
{
    public function show($id)
    {
        $user = User::find($id);
        return view('users.show',[
            'title' => 'プロフィール',
            'user' => $user,
        ]);
    }
    
    public function edit(int $id)
    {
        $user = User::find($id);
        return view('users.edit',[
            'title' => 'プロフィール編集',
            'user' => $user,
        ]); 
    }
    
    public function update(int $id, UserRequest $request){
        $user = User::find($id);
        $user->update($request->only(['name', 'email', 'profile']));
        session()->flash('success', 'プロフィールを編集しました!');
        return redirect()->route('users.show');
    }
UserRequest.php
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UserRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'name' => ['required', 'min:2', 'max20'],
            'email' => ['required',],
            'profile' => ['required', 'min:2', 'max:50'],
            'image' => [
                'required',
                'file',
                'image',
                'mimes:jpeg,png',
                'dimensions:min_width=50,min_height=50,max_width=200,max_height=200',
            ]
        ];
    }
}
show.blade.php(プロフィール画面のビュー)
@extends('layouts.logged_in')

@section('content')
<h1>{{ $title }}</h1>

<a href="{{ route('users.edit', Auth::user() )}}">編集</a>

    @if($user !== null)
    <div>
        名前
        {{ $user->name }}
    </div>
    <div>
  @if($user->image !== '')
      <img src="{{ asset('storage/' . $user->image) }}">
  @else
      <img src="{{ asset('images/no_image.png') }}">
  @endif
        <a href="{{ route('users.edit_image', $user) }}">画像を変更</a>
    </div>
    <div>
        <span>プロフィール</span>
        <ul>
            @if($user->profile)
            <li>{{ $user->profile }}</li>
            @else
            <li>プロフィールが設定されていません。</li>
            @endif
        </ul>
    </div>
    
    @else
<p>設定されていません。</p>

    
    @endif
@endsection
edit.blade.php(プロフィール編集画面のビュー)
@extends('layouts.logged_in')

@section('content')
<h1>{{ $title }}</h1>

<ul>
    <li><a href="/users">戻る</a></li>
</ul>

<form method="POST" action="{{ route('users.show', $user) }}">
    @csrf
    @method('PATCH')
    <div>
        <label>
            名前:
            <input type="text" name="name" value="{{ $user->name }}">
        </label>
    </div>
    <div>
        <label>
            <input type="email" name="email" value="{{ $user->email }}">
        </label>
    </div>
    <div>
        <label>
            <textarea type="text" name="log" rows="12" cols="50">{{ $user->profile }}</textarea>
        </label>
    </div>
    
    <input type="submit" value="保存">
    
</form>

@endsection

自分で試したこと

バリデーションの見直し、編集画面からプロフィール画面に飛ぶ際のルーティングのチェック

0

1Answer

条件はクリアされていないと思います。

edit.blade.php
<textarea type="text" name="log" rows="12" cols="50">{{ $user->profile }}</textarea>

name属性が無いのでlogになっているのでprofileのデータは送られていないと思います。
同じくname属性にimageが設定された要素も見当たりません。

エラーメッセージは正しく、この2つが不足していると思います。

ブラウザのデベロッパーツールはリクエストの状況(送信データ等)を確認できます。

image.png

サーバー側では$request->all()で全データを取得することができます。

1

Comments

  1. (訂正)name属性が無いので -> name属性がlogになっているので
  2. @replica410

    Questioner
    ありがとうございます。無事表示する事ができました!

Your answer might help someone💌