2016-05-08 3 views
-1

Ich bin neu bei Schienen und ich benutze das einfache Bootstrap-Formular, um die Informationen eines Benutzers zu aktualisieren, aber es ruft immer wieder den falschen Controller.Rails Form Aufruf der falschen Methode

-Code für das Formular:

simple_form_for(@user) do |f| 
= f.input :forename 
= f.input :surname 
.form-actions 
    = f.button :submit, :method => :update 

-Code in der Steuerung:

def update 
    if @user.update(user_params) 
    redirect_to home_path 
    else 
    redirect_to wrong_path 
end 

-Code in Routen:

resources :user do 
    member do 
    post :update 
    end 
end 

aber in einer anderen Seite verwende ich die Form wieder in einem verschiedene Controller namens AdminController das update Formular ruft die AdminController anstelle der UserController.

Was muß ich bekomme es die richtigen Controller zu nennen/

Antwort

2

Der Fehler ist in der Form nicht, sondern ein Mangel an Verständnis, wie RESTful-Routing in Schienen funktioniert.

In den Schienenkonventionen aktualisieren Sie einen Datensatz, indem Sie eine PATCH-Anfrage senden.

PATCH /users/:id => user#update 

In der Tat, wenn Sie erklären, die Route:

resources :users 

Rails diesen Weg für Sie erstellt. Beachten Sie, dass der Name im Plural sein sollte! Gleiches gilt für die Steuerung UsersController nicht UserController.

Wenn Sie ein Formular erstellen und eine Ressource wie so passieren:

# sugar on top of form_for 
simple_form_for(@user) do |f| 

Rails auf dem Rekord schauen und versuchen, eine entsprechende Route auf den Konventionen der Grundlage zu finden. Sie müssen die Methode nicht angeben, da Rails prüft, ob das Modell persistent ist.

Wenn Sie aus irgendeinem Grund wirklich die HTTP-Methode angeben müssen, tun Sie es auf dem <form> Element - nicht auf der Schaltfläche senden.

simple_form_for(@user, method: :patch) do |f| 

Zusätzlich ist die herkömmliche Art und Weise mit einem Update Route zu behandeln ist:

def update 
    if @user.update(user_params) 
    redirect_to home_path 
    else 
    render :edit 
    end 
end 

Sie wollen nicht nach einer gescheiterten Formulareinreichung umleiten - der Benutzer keine Daten verloren gehen, in das Formular eingetragen. Stattdessen möchten Sie das Formular erneut rendern.

+0

Das klingt vielleicht albern, aber ich habe keine Ahnung, was ich tue. Muss ich die "PATCH" -Linie in Routen hinzufügen? –

+0

nein - ändern Sie die Route zum Lesen nur 'Ressourcen: Benutzer' – max