После отправки ничего не происходит - PullRequest
0 голосов
/ 07 декабря 2018

Я создаю форум с Laravel.После нажатия кнопки отправки для создания нового потока ничего не происходит, пользователь не перенаправляется и поток не появляется в базе данных.

Вот мой контроллер:

public function store(ThreadValidation $rules, $request)
{
    $thread = Thread::create([
        'user_id' => auth()->id(),
        'channel_id' => request('channel_id'),
        'title' => request('title'),
        'body' => request('body'),
    ]);

    return redirect($thread->path());
}

Модель:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Thread extends Model
{
    protected $guarded = [];
    protected $fillable = ['title', 'body', 'user_id', 'channel_id'];

    public function creator()
    {
        return $this->belongsTo(User::class, 'user_id');
    }

    public function replies()
    {
        return $this->hasMany(Reply::class);
    }

    public function addReply($reply)
    {
        $this->replies()->create($reply);
    }

    public function path()
    {
        return "/threads/{$this->channel->slug}/{$this->id}";
    }

    public function channel()
    {
       return $this->belongsTo(Channel::class, 'channel_id');
    }
}

Маршруты:

Route::get('/', function () {
        return view('welcome');
});

Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
Route::get('threads', 'ThreadsController@index');
Route::get('threads/create', 'ThreadsController@create');
Route::get('threads/{channel}/{thread}', 'ThreadsController@show');
Route::post('/threads', 'ThreadsController@store');
Route::get('threads/{channel}', 'ThreadsController@index');
Route::post('threads/{channel}/{thread}/replies', 'RepliesController@store');

Blade:

<div class="container">
    <div class="row">
        <div class="col-md-8 offset-md-2">
            <div class="card card-default">
                <div class="card-header">Create a New Thread</div>
                <div class="card-body">
                  <form method="POST" action="/threads">
                    @csrf
                    <div class="form-group">
                      <label for="title">Add a title</label>
                      <input type="text" class="form-control" name="title" id="title">
                    </div>
                    <div class="form-group">
                      <label for="body"></label>
                      <textarea name="body" id="body" class="form-control" rows="8"></textarea> 
                    </div>
                    <button type="submit" class="btn btn-primary">Publish</button>
                  </form>
                </div>
            </div>
        </div>
    </div>
</div>

Я был бы очень признателен, если бы вы сказали мне, что не так, потому что мой тест на самом деле проходит.

/**
 * @test
 */
public function an_authenticated_user_can_create_forum_threads()
{
    $this->withExceptionHandling()
        ->signIn();

    $thread = create('App\Models\Thread');
    $this->post('/threads', $thread->toArray());

    $this->get($thread->path())
        ->assertSee($thread->title)
        ->assertSee($thread->body);
}

Обновление: запрос формы:

public function rules()
{
    return [
        'title' => 'required',
        'body' => 'required',
        'channel_id' => 'required||exists:channels, id',
    ];
}

1 Ответ

0 голосов
/ 07 декабря 2018

Ваш почтовый запрос не содержит channel_id, поэтому проверка не будет выполнена: 'channel_id' => request('channel_id'), и поэтому ваш запрос не будет обработан правильно.

Вам нужно будет добавить поле ввода, котороесодержит эту переменную или удалите ее из проверки.В запросах заказа это будет работать, потому что URL-адрес иногда содержит идентификатор, но так как этот URL-адрес /threads, он, очевидно, не содержит эту переменную.

Если вы не можете или не хотите форсировать эту переменную, выможет удалить правило проверки и предоставить значение по умолчанию, если переменная запроса отсутствует (однако я бы посоветовал против этого, поскольку лучше требовать эту переменную, если она вам нужна где-то еще, поскольку это избавляет вас от необходимости проверять больше, если она есть).задавать).Для этого вы можете использовать оператор Null coalescing , например:

$thread = Thread::create(
    [
    'user_id' => auth()->id(),
    'channel_id' => request('channel_id') ?? "Default value",
    'title' => request('title'),
    'body' => request('body'),
    ]
);

Надеюсь, это поможет вам

...