2017-02-10 4 views
0

Ich arbeite an einer Spielzeug-Web-App, um Ruby on Rails zu üben, und ich bin auf ein Problem gestoßen, das ich in der Dokumentation nicht herausfinden konnte. Im Wesentlichen habe ich ein Formular, um Aufgaben zu erstellen und sie mit Benutzern in Beziehung zu setzen, aber das Formular gibt einen Fehler 302 aus, wenn es gesendet wird, und der Datensatz wird nicht gespeichert.Rails Create 302 Fehler

Ich habe zwei Modelle, Benutzer und Aufgaben Benutzer

class User < ApplicationRecord 
    has_many :tasks 
end 

Aufgabe

class Task < ApplicationRecord 
    belongs_to :article 
end 

Die Idee ist einfach, kann ein Benutzer viele Aufgaben haben. Die Migrationen für diese funktionieren gut.

I eine (teilweise) Form für die Erstellung von Aufgaben erstellt haben:

_compact_form.html.erb

<%= form_for([@currentUser, @currentUser.tasks.build]) do |f| %> 
<p> 
    <%= f.label :label %> 
    <%= f.text_field :label %> 
    <%= f.label :complete %> 
    <%= f.check_box :complete%> 

    <%= f.submit %> 
</p> 
<% end %> 

und dieser ist an einem Armaturenbrett Ansicht, die ein Armaturenbrett-Steuerung bis trivially verdrahtet :

class DashboardController < ApplicationController 
    def index 
     @currentUser = User.find(1) 
    end 
end 

Alles ziemlich gerade so weit. Mein Aufgaben-Controller verfügt über einige Methoden, um die Erstellung bisher zu verwalten.

Aufgaben Controller:

class TasksController < ApplicationController 
    def new 
    end 

    def show 
     @user = User.find(params[:user_id]) 
    end 

    def create 
     @user = User.find(params[:user_id]) 
     @task = @user.tasks.create(task_params) 

     redirect_to '/' 

    end 

    private 
    def task_params 
     params.require(:task).permit(:label, :complete) 
    end 
end 

Und jetzt sind wir an dem Punkt sind, wo ich verwirrt. Ich habe eine Aufgabe manuell in meine Datenbank eingefügt und kann sie problemlos abrufen, aber aus irgendeinem Grund gibt meine Erstellungsroute einen HTTP 302-Fehler. Ich habe meine Routen wie so ein:

resources :users do 
     resource :tasks 
    end 

    root 'dashboard#index' 
    get 'dashboard/index' 

und Rechen Routen gibt

  Prefix Verb URI Pattern       Controller#Action 
new_user_tasks GET /users/:user_id/tasks/new(.:format) tasks#new 
edit_user_tasks GET /users/:user_id/tasks/edit(.:format) tasks#edit 
    user_tasks GET /users/:user_id/tasks(.:format)  tasks#show 
       PATCH /users/:user_id/tasks(.:format)  tasks#update 
       PUT /users/:user_id/tasks(.:format)  tasks#update 
       DELETE /users/:user_id/tasks(.:format)  tasks#destroy 
       POST /users/:user_id/tasks(.:format)  tasks#create 
      users GET /users(.:format)      users#index 
       POST /users(.:format)      users#create 
     new_user GET /users/new(.:format)     users#new 
     edit_user GET /users/:id/edit(.:format)   users#edit 
      user GET /users/:id(.:format)     users#show 
       PATCH /users/:id(.:format)     users#update 
       PUT /users/:id(.:format)     users#update 
       DELETE /users/:id(.:format)     users#destroy 
      root GET /         dashboard#index 
dashboard_index GET /dashboard/index(.:format)   dashboard#index 

so die Route erstellen erscheint, dort zu sein, und es scheint korrekt zu sein.

Jetzt für den seltsamsten Teil! Wenn ich meine Form zu verwenden, ist es das, was ich in der Konsole sehen:

User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] 
    (0.1ms) begin transaction 
    (0.1ms) commit transaction 

Dies scheint der richtige Code in meinen Aufgaben # create-Methode zu sein, also ist ich ziemlich verwirrt, wo die Daten gehen. Kann jemand etwas Licht in die nächsten Schritte werfen, um das zu debuggen? Ich habe einige Zeit damit verbracht, verschiedene Formen zu erstellen und die Beispiele in this Leitfaden zu bearbeiten, aber ich habe anscheinend irgendwo einen Fehler gemacht und ich kann es nicht finden.

+0

HTTP 302 bedeutet, dass es zeitlich umgeleitet wird, was das richtige Verhalten ist, da Sie in Ihrer create-Methode 'redirect_to '/'' aufrufen. – danirod

+0

Und sollte das den neu erstellten Datensatz entfernen? Ich hätte hinzufügen sollen, dass die Datenbank nicht aktualisiert wird. – Grisk

+0

Können Sie die Parameter bitte posten –

Antwort

1

Sie sollten Ihre Umleitung innerhalb eines respond_to Block deklarieren, Umleitungen ohne Format Erklärung Ursache 302 Statusantworten, weil sie nicht weiß, welche Art von Antwort für die Umleitung zu geben, so nimmt Ihr Kunde würde die location Header-Feld verarbeiten, geht mit der Antwort, sollten Sie etwas tun:

respond_to do |format| 
    format.html { redirect_to '/' } 
end 

302 Status nicht ein Fehler ist, ist es ein Zeichen für die Umleitung und die umgeleiteten Position wird als HTTP-Header gesendet. Soweit das Modell nicht gespeichert wird, sollten Sie bessere Log-Ergebnisse liefern, es könnte eine große Anzahl von Problemen geben, wie unzulässige Params, Validierungen, Datenbankfehler ...

+0

Ich werde diese Antwort akzeptieren, weil Sie mir klar gemacht haben, dass das Problem nicht über den HTTP-Fehler sein konnte. Das eigentliche Problem war in der Deklaration des Modells. Beachten Sie im Code, den ich gepostet habe, dass die Aufgabe mit Artikel statt mit Benutzer verknüpft ist. Dies ist ein Überbleibsel aus meinem letzten Prototyp, den ich vergessen habe zu ändern. Leider überraschte mich der 302 und ich ging einen völlig inkorrekten Debugging-Pfad hinunter. – Grisk