Как я могу исправить эту ошибку, я получаю «Извините, страница, которую вы ищете, не может быть найдена». - PullRequest
1 голос
/ 10 ноября 2019

У меня есть приложение, в котором я пытаюсь заставить автора вопроса пометить ответ как лучший.

У меня есть AcceptAnswerController, созданный, который был зарегистрирован вroutes/web.php файл, как показано ниже:

AcceptAnswerController.php

class AcceptAnswerController extends Controller
{
    public function __invoke(Answer $answer) 
    {
        $this->authorize('accept', $answer);

        $answer->question->acceptBestAnswer($answer);
        return back();
    }
}

web.php

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

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');

Route::resource('questions', 'QuestionsController')->except('show');

Route::resource('questions.answers', 'AnswersController')->only(['store', 'edit', 'update', 'destroy']);

Route::get('questions/{slug}', 'QuestionsController@show')->name('questions.show');

Route::post('answers/{answer}/accept', 'AcceptAnswerController')->name('answers.accept');

В моем представлении ответов у меня есть следующее:

<div class="row mt-4">
    <div class="col-md-12">
        <div class="card">
            <div class="card-body">
                <div class="card-title">
                    <h2>{{ $answersCount . " " . str_plural('Answer', $answersCount) }}</h2>
                </div>
                <hr>
                @include ('layouts._messages')

                @foreach ($answers as $answer)
                    <div class="media">
                        <div class="d-fex flex-column vote-controls">
                            <a title="This answer is useful" class="vote-up">
                                <i class="fas fa-caret-up fa-3x"></i>
                            </a>
                            <span class="votes-count">1230</span>
                            <a title="This answer is not useful" class="vote-down off">
                                <i class="fas fa-caret-down fa-3x"></i>
                            </a>
                            @can ('accept', $answer)
                                <a title="Mark this answer as best answer" 
                                    class="{{ $answer->status }} mt-2"
                                    onclick="event.preventDefault(); document.getElementById('answer-{{ $answer->id }}').submit();"
                                    >
                                    <i class="fas fa-check fa-2x"></i>                                    
                                </a>
                                <form id="answer-{{ $answer->id }}" action="{{ route('answers.accept', ['answer' => $answer->id]) }}" method="POST" style="display:none;">
                                    @csrf
                                </form>
                            @else
                                @if ($answer->is_best)
                                    <a title="The question owner accepted this answer as best answer" 
                                        class="{{ $answer->status }} mt-2"                                        
                                        >
                                        <i class="fas fa-check fa-2x"></i>                                    
                                    </a>
                                @endif
                            @endcan
                        </div>
                        <div class="media-body">
                            {!! $answer->body_html !!}
                            <div class="row">
                                <div class="col-4">
                                    <div class="ml-auto">
                                        @can ('update', $answer)
                                            <a href="{{ route('questions.answers.edit', ['question' => $question->id, 'answer' => $answer->id]) }}" class="btn btn-sm btn-outline-info">Edit</a>
                                        @endcan
                                        @can ('delete', $answer)
                                            <form class="form-delete" method="post" action="{{ route('questions.answers.destroy', [$question->id, $answer->id]) }}">
                                                @method('DELETE')
                                                @csrf
                                                <button type="submit" class="btn btn-sm btn-outline-danger" onclick="return confirm('Are you sure?')">Delete</button>
                                            </form>
                                        @endcan
                                    </div>
                                </div>
                                <div class="col-4"></div>
                                <div class="col-4">
                                    <span class="text-muted">Answered {{ $answer->created_date }}</span>
                                    <div class="media mt-2">
                                        <a href="{{ $answer->user->url }}" class="pr-2">
                                            <img src="{{ $answer->user->avatar }}">
                                        </a>
                                        <div class="media-body mt-1">
                                            <a href="{{ $answer->user->url }}">{{ $answer->user->name }}</a>
                                        </div>
                                    </div>
                                </div>
                            </div>                            
                        </div>
                    </div>
                    <hr>
                @endforeach
            </div>
        </div>
    </div>
</div>

Как только автор вопроса нажимает на значок галочки, он должен пометить ответ как лучший ответ, но я получаю следующую ошибку:

Извините, страница, которую вы ищетедля не может быть найдено

Я вижу, что идентификатор ответа отсутствует в URL следующим образом:

http://localhost:8000/answers//accept

когдана самом деле это должно быть что-то вроде этого:

http://localhost:8000/answers/1/accept

Я не могу понять, почему, когда я передал его в качестве параметра маршрута в действии формы,То же самое происходит, если пользователь пытается отредактировать свой ответ.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2019

Итак, после тщательного изучения моего кода все остальное показалось нормальным контроллером, маршрутами, представлениями. Я смог выделить проблему в этом регионе

@can ('accept', $answer)
 <a title="Mark this answer as best answer" 
   class="{{ $answer->status }} mt-2"
  onclick="event.preventDefault(); document.getElementById('answer-{{ $answer->id }}').submit();"
                                   >
    <i class="fas fa-check fa-2x"></i>                                    
 </a>
 <form id="answer-{{ $answer->id }}" action="{{ route('answers.accept', ['answer' => $answer->id]) }}" method="POST" style="display:none;">
     @csrf
 </form>
@endcan

Я был уверен, что $answer->id должен был вернуть правильный идентификатор, но я не был слишком уверен в $answer->status, поэтому я решилпроверьте его аксессор, определенный в модели ответа.

public function getStatusAttribute()
{
   return $this->isBest() ? 'vote-accepted' : '';
}

public function isBest()
{
   return $this->id = $this->question->best_answer_id; /** here is the problem **/
}

Там проблема смотрела прямо на меня. Метод isBest, приведенный выше, должен был возвращать логическое значение, но я ошибочно назначал. Это было простое исправление.

public function isBest()
{
   return $this->id === $this->question->best_answer_id; /** here is the problem **/
}
0 голосов
/ 10 ноября 2019

Могу ли я предложить немного изменить вашу стратегию и обойти необходимость отправки формы?

Если вы поменяете POST для запроса GET, это на самом деле довольно просто.

answers.blade.php

@foreach( $answers as $answer )
    @can('accept', $answer)
        <a href="answers/{{ $answer->id }}/accept" title="Mark this answer as best answer" class="{{ $answer->status }} mt-2">
            <i class="fas fa-check fa-2x"></i>
        </a>
    @else
        <p>Do your thing</p>
    @endcan 
@endforeach

rout.web.php

Route::get('answers/{answer}/accept', 'AcceptAnswerController');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...