Laravel - "The GET method is not supported for this route. Supported methods: PUT."

 
Vista:
Imágen de perfil de Cristina
Val: 86
Oro
Ha aumentado 1 puesto en Laravel (en relación al último mes)
Gráfica de Laravel

"The GET method is not supported for this route. Supported methods: PUT."

Publicado por Cristina (28 intervenciones) el 13/08/2019 19:16:22
Hola, ante todo disculpa, soy muy nueva en esto y al igual la cosa es un poco tonta.
Estoy creando un proyecto para el cual cloné de git-hub el blog : milon / laravel-blog. Todo bien, funciona genial, pero está en inglés y mi sitio ha de poder traducirse al castellano y catalán. Instalé el paquete dimsav/laravel-translatable y mcamara/laravel-localization. En el archivo de rutas se han de poner todas las rutas dentro de:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Route::group([
    'prefix' => LaravelLocalization::setLocale(),
    'middleware' => [ 'localeSessionRedirect', 'localizationRedirect', 'localeViewPath' ]
], function()
{
    Route::get('/', 'BlogController@index');
    Route::get('/posts/{post}', 'BlogController@post');
    Route::post('/posts/{post}/comment', 'BlogController@comment')->middleware('auth');
 
    Auth::routes();
 
    Route::get('/home', 'HomeController@index');
 
    Route::group(['prefix' => 'admin', 'namespace' => 'Admin', 'middleware' => 'auth'], function() {
        Route::resource('/posts', 'PostController');
        Route::put('/posts/{post}/publish', 'PostController@publish')->middleware('admin');
        Route::resource('/categories', 'CategoryController', ['except' => ['show']]);
        Route::resource('/tags', 'TagController', ['except' => ['show']]);
        Route::resource('/comments', 'CommentController', ['only' => ['index', 'destroy']]);
        Route::resource('/users', 'UserController', ['middleware' => 'admin', 'only' => ['index', 'destroy']]);
    });
});

Y aquí viene el problema, si las rutas están fuera del grupo de rutas para la traducción, funciona correctamente, pero al ponerlo dentro, por ejemplo la función que publica los posts me arroja el error:

"The GET method is not supported for this route. Supported methods: PUT."

El código que realiza la petición es este:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
@extends('layouts.app')
 
@section('content')
    <div class="container">
        <div class="row">
 
            <div class="col-md-12">
                <div class="panel panel-default">
                    <div class="panel-heading">
                        <h2>
                            Posts
 
                            <a href="{{ url('admin/posts/create') }}" class="btn btn-default pull-right">{!! trans ('web.Create_New') !!}</a>
                        </h2>
                    </div>
 
                    <div class="panel-body">
                        <table class="table">
                            <thead>
                                <tr>
                                    <th>{!! trans ('web.title') !!}</th>
                                    <th>{!! trans ('web.body') !!}</th>
                                    <th>{!! trans ('web.author') !!}</th>
                                    <th>{!! trans ('web.Category') !!}</th>
                                    <th>{!! trans ('web.Tags') !!}</th>
                                    <th>{!! trans ('web.Published') !!}</th>
                                    <th>{!! trans ('web.Action') !!}</th>
                                </tr>
                            </thead>
                            <tbody>
                                @forelse ($posts as $post)
                                    <tr>
                                        <td>{{ $post->title }}</td>
                                        <td>{{\Illuminate\Support\Str::limit($post->body, 60) }}</td>
                                        <td>{{ $post->user->name }}</td>
                                        <td>{{ $post->category->name }}</td>
                                        <td>{{ $post->tags->implode('name', ', ') }}</td>
                                        <td>{{ $post->published }}</td>
                                        <td>
                                            @if (Auth::user()->is_admin)
                                                @php
                                                    if($post->published == trans ('web.yes')) {
                                                        $label = trans ('web.Draft');
                                                    } else {
                                                        $label = trans ('web.publish');
                                                    }
                                                @endphp
 
                                                <a href="{{ url("/admin/posts/{$post->id}/publish") }}" data-method="PUT" data-token="{{ csrf_token() }}" data-confirm="{{trans ('web.are_you_sure')}}" class="btn btn-xs btn-warning">{{ $label }}</a>
                                            @endif
                                            <a href="{{ url("/admin/posts/{$post->id}") }}" class="btn btn-xs btn-success">{!! trans ('web.show') !!}</a>
                                            <a href="{{ url("/admin/posts/{$post->id}/edit") }}" class="btn btn-xs btn-info">{!! trans ('web.edit') !!}</a>
                                            <a href="{{ url("/admin/posts/{$post->id}") }}" data-method="DELETE" data-token="{{ csrf_token() }}" data-confirm="{{trans ('web.are_you_sure')}}" class="btn btn-xs btn-danger">{!! trans ('web.delete') !!}</a>
                                        </td>
                                    </tr>
                                @empty
                                    <tr>
                                        <td colspan="5">{!! trans ('web.No_post_available') !!}</td>
                                    </tr>
                                @endforelse
                            </tbody>
                        </table>
 
                        {!! $posts->links() !!}
 
                    </div>
                </div>
            </div>
 
        </div>
    </div>
@endsection

Tampoco entiendo como si no está dentro de un form puede realizar la acción... pues intenté ponerlo dentro de form y añadir la recomendación de los inputs hidden con el _method:put que aconsejan en la docu de laravel... pero no lo conseguí.

Agradezco la ayuda, llevo mucho rato intentando encontrar la solución.

Saludoooos!!!

Cristina
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 36
Ha mantenido su posición en Laravel (en relación al último mes)
Gráfica de Laravel

"The GET method is not supported for this route. Supported methods: PUT."

Publicado por preguntas (11 intervenciones) el 14/08/2019 06:08:36
Hola! Podrías poner también de código de tu controlador de posts, por favor?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Cristina
Val: 86
Oro
Ha aumentado 1 puesto en Laravel (en relación al último mes)
Gráfica de Laravel

"The GET method is not supported for this route. Supported methods: PUT."

Publicado por Cristina (28 intervenciones) el 14/08/2019 11:23:16
Aquí lo tienes:

1
2
3
4
5
6
7
8
public function publish(Post $post)
{
    $post->is_published = !$post->is_published;
    $post->save();
    flash()->overlay('Post changed successfully.');
 
    return redirect('/admin/posts');
}

Gracias!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 36
Ha mantenido su posición en Laravel (en relación al último mes)
Gráfica de Laravel

"The GET method is not supported for this route. Supported methods: PUT."

Publicado por preguntas (11 intervenciones) el 15/08/2019 06:48:24
Si ejecutas este comando por consola:
1
php artisan route:list

Qué método indica que es esta ruta?

1
admin/posts/create
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Cristina
Val: 86
Oro
Ha aumentado 1 puesto en Laravel (en relación al último mes)
Gráfica de Laravel

"The GET method is not supported for this route. Supported methods: PUT."

Publicado por Cristina (28 intervenciones) el 15/08/2019 09:36:52
Hola, la ruta utiliza el método PUT
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 36
Ha mantenido su posición en Laravel (en relación al último mes)
Gráfica de Laravel

"The GET method is not supported for this route. Supported methods: PUT."

Publicado por preguntas (11 intervenciones) el 15/08/2019 18:24:47
Ok, creo que estamos hablando de cosas distintas jajaja perdón.

Ahora... Tienes un link (linea 49) que llama a esta ruta: /admin/posts/{$post->id}/publish.

Cuando presionas este link se activa alguna llamada ajax o por el estilo? o solo te lleva a la pagina y te muestra el error?

Reemplaza la linea 49:

1
<a href="{{ url("/admin/posts/{$post->id}/publish") }}" data-method="PUT" data-token="{{ csrf_token() }}" data-confirm="{{trans ('web.are_you_sure')}}" class="btn btn-xs btn-warning">{{ $label }}</a>

por

1
2
3
4
5
<form action='{{ url("/admin/posts/{$post->id}/publish") }}' method="POST">
  @method('PUT')
  @csrf
  <button type="submit">{{ $label }}</button>
</form>

Que muestra?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 36
Ha mantenido su posición en Laravel (en relación al último mes)
Gráfica de Laravel

"The GET method is not supported for this route. Supported methods: PUT."

Publicado por preguntas (11 intervenciones) el 15/08/2019 18:46:41
Asegurémonos un poco mejor...

Reemplacemos:

Esta linea:

1
Route::put('/posts/{post}/publish', 'PostController@publish')->middleware('admin');

por

1
Route::put('/posts/{post}/publish', 'PostController@publish')->middleware('admin')->name('publicar');

--------------------

Esta linea:

1
<a href="{{ url("/admin/posts/{$post->id}/publish") }}" data-method="PUT" data-token="{{ csrf_token() }}" data-confirm="{{trans ('web.are_you_sure')}}" class="btn btn-xs btn-warning">{{ $label }}</a>

por

1
2
3
4
5
<form action='{{ route("publicar", $post) }}' method="POST">
  @method('PUT')
  @csrf
  <button type="submit">{{ $label }}</button>
</form>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Cristina
Val: 86
Oro
Ha aumentado 1 puesto en Laravel (en relación al último mes)
Gráfica de Laravel

"The GET method is not supported for this route. Supported methods: PUT."

Publicado por Cristina (28 intervenciones) el 21/08/2019 18:55:59
Disculpa el otro día no te entendí, al usar la consola para ver las rutas marca GET|HEAD

No es una llamada ajax, por lo que veo, esta plantilla refresca la vista o algo así.

Gracias por tu respuesta, con los cambios que propones queda solucionado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar