2017-11-27 5 views
0

Ich habe einen sehr einfachen Web-App in Laravel erstellt 5.5:Laravel Route plane Fehler MethodNotAllowedHttpException

Es gibt eine Datenbank mit einer Liste von Gutscheincodes, die entweder nicht eingelöst worden oder zurückgenommen worden ist. 0 wird nicht eingelöst und 1 wird eingelöst.

Wenn jemand einen String in eine HTML-Formulareingabe eingibt und ihn abgibt, geht Laravel zu einer Route mit dieser Zeichenfolge als Variable.

Der Controller-Code lautet wie folgt:

public function redeemCoupon ($coupon_code) 

    { 
     $coupon = Coupon::where('coupon_code', $coupon_code)->first(); 

     if ($coupon === null) { 
      return view ('pages.no-coupon'); 
     } 

     else if ($coupon->redeemed == 1) { 
      return view ('pages.used-coupon'); 
     } 
     else { 

      $coupon->redeemed = 1; 
      $coupon->update(); 
      return view('pages.redeemed-coupon', compact('coupon')); 
     } 
    } 

Route:

Route::post('/redeem-coupon/{coupon_code}', '[email protected]'); 

Sie können es hier ausprobieren: http://178.62.4.225

Alles funktioniert gut, wenn normalerweise getan, auf die getestet Code "Code01". Wenn ich es eingebe und es nicht eingelöst wurde, sagt es das, und wenn ich es einlöse, wird die Spalte in der Datenbank von 0 auf 1 geändert. Wenn ich den Prozess erneut versuche, sagt er mir, dass er bereits eingelöst wurde.

Das Problem ist, wenn ich auf der Seite bin, das mir sagt es eingelöst worden ist: http://178.62.4.225/redeem-coupon/code01

Wenn ich es mit STRG + R zu aktualisieren, es lädt nur und sagt, dass es bereits eingelöst. Aber wenn ich die URL in eine neue Registerkarte einfüge oder hineinklicke und durch einen Klick auf Enter aktualisiere, gibt es "MethodNotAllowedHttpException" und der resultierende Debug-Bildschirm, von dem, was ich sagen kann, bietet nichts von Nutzen.

Hilfe!

Antwort

0

Sie machen eine GET-Anfrage und definieren einen Beitrag Routenänderung

Route::post('/redeem-coupon/{coupon_code}', '[email protected]'); 

zu:

Route::get('/redeem-coupon/{coupon_code}', '[email protected]'); 
+0

Dies gibt immer noch den gleichen Fehler. Aber ich sehe nicht, wie das funktionieren würde, da es eine Postanforderung sein muss, wenn der Code nicht eingelöst wurde, um die DB-Spalte von einer 0 zu einer 1 zu ändern? –

+0

@RuairiMcNicholas Also solltest du die Seite laden und dann den Couponstatus per Postanfrage über AJAX überprüfen – Michael

1

Ändern
Route::post('/redeem-coupon/{coupon_code}', '[email protected]'); 

zu

Route::any('/redeem-coupon/{coupon_code}', '[email protected]'); 

Hat der Trick

+0

Warum irgendwas und keine Methode holen? – Michael

+0

GET gibt den gleichen Fehler, den ich als POST verwendet habe. Ich brauche es auch, um beides zu tun. Wenn "eingelöst" im DB = 0, brauche ich POST, um es zu 1 zu ändern, wenn es bereits = 1 ist, brauche ich es, um die Ansicht zurückzugeben, die das mit GET sagt. –

+0

Also, anstelle von irgendwelchen, einfach Route hinzufügen .. – Michael

0

Ist eingelöst als geschützt? Wenn Sie app_debug true anzeigen, werden alle DB-Verbindungsinformationen (Benutzer und Pass) angezeigt.

Mehr als wahrscheinlich aufgrund der _method.

Welche Seite ist _method = "POST" an?

+0

Im Coupon-Modell habe ich es unter "protected $ fillable = [" aufgeführt, was meiner Meinung nach bedeutet, dass es geschützt ist, sollte es nicht sein? –

+0

@RuairiMcNicholas Das ist nur für, wenn das Modell aktualisiert wird. Es hat wahrscheinlich mit der ihr zugewiesenen Methode zu tun. Jede _Methode ist einem Routentyp zugeordnet. https://laravel.com/docs/5.5/routing – connormcwood

Verwandte Themen