2016-05-25 4 views
1

Ich habe ein Problem mit einer Schaltfläche, die mit der Aktion "Neu" auf dem aktuellen Controller namens "Clients" verknüpft ist.Wie generiert man Links mit RESTful-Routen auf Rails?

Wenn angeklickt haben eine Rails Routing Fehler zeigen:

No route matches [POST] "clients/new"

Dies ist der Code, den ich verwende, die den Fehler erzeugt:

<%= button_to("New Client", new_client_path, :class => "btn btn-lg btn-primary pull-right add-button") %> 

Wenn ich den Pfad zu clients_path ändern, wie dies:

<%= button_to("New Client", clients_path, :class => "btn btn-lg btn-primary pull-right add-button") %> 

dann bekomme ich folgende Fehlermeldung:

Unknown action. The action 'create' could not be found for ClientsController

Controller-Aktionen neu und erstellen:

def new 
    @client = Client.new 
end 

def create 
    @client = Client.new(client_params) 

    if @client.save 
    flash[:notice] = "Client added succesfully." 
    redirect_to client_path(@client) 
    else 
    render 'new' 
    end 
end 

Die routes.rb Datei enthält folgende Komponenten:

Rails.application.routes.draw do 

    get 'clients/index' 

    get 'clients/show' 

    get 'clients/new' 

    get 'clients/edit' 

    get 'clients/delete' 

    resources :clients 

end 

Gerade jetzt clients ist die einzige Ressource, die ich geschaffen habe. Was fehlt mir, um Links mit Hilfe von RESTful-Routen zu erstellen?

Antwort

1

Ein paar Dinge müssen zu schaffen ändern, um dies für Sie arbeiten zu lassen. Erstens sind Ihre Routen redundant und widersprechen der Rails-Konvention. Sie sollten alle get Routen entfernen und einfach die resources Routen verwenden. Das ist alles, was Sie für Ihre Kunden Routen benötigen:

Rails.application.routes.draw do 

    # notice, no "get" routes 

    resources :clients 
end 

Als nächstes button_to standardmäßig eine POST Methode, so dass Sie Methode überschrieben haben es ist, wenn es mit einem GET Route. Weitere Informationen finden Sie unter button_to API documentation.

Try this statt:

<%= button_to("New Client", new_client_path, { method: :get, :class => "btn btn-lg btn-primary pull-right add-button" }) %> 

Beachten Sie, dass button_to, wie viele der Helfer ActionView Form, 2 separaten Hashes akzeptiert, die erste options zu sein, und die zweiten html_options zu sein. Es ist wichtig, die Hashwerte zu trennen, sonst erhalten Sie nicht das von Ihnen gewünschte Verhalten. Die Optionen method und class gehen in html_options. Wenn Sie nur einen Hash von Optionen (geschweifte Klammern sind optional) in Ihrem Aufruf haben, wird Ruby sie dem letzten Hash-Argument zuweisen; Sie können explizit alle Hashes liefern, um es dem Leser Ihres Codes deutlich zu machen, was Sie soll, wie folgt aus:

<%= button_to("New Client", new_client_path, {}, { method: :get, :class => "btn btn-lg btn-primary pull-right add-button" }) %> 

Last, der Versuch, die clients_path Route Helfer führte zu einem Pfad für die ClientController#index Methode zu verwenden (zB /clients), begleitet von einem scheinbar unverwandten Fehler über eine create Methode. Die Aktion create ist die Route POST mit demselben URL-Pfad wie die Aktion index. Wenn Sie am Ausgang des rake routes für diese Ressource betrachten, sehen Sie Folgendes:

 Prefix Verb URI Pattern     Controller#Action 
    clients GET /clients(.:format)   clients#index 
      POST /clients(.:format)   clients#create 
    new_client GET /clients/new(.:format)  clients#new 
edit_client GET /clients/:id/edit(.:format) clients#edit 
     client GET /clients/:id(.:format)  clients#show 
      PATCH /clients/:id(.:format)  clients#update 
      PUT /clients/:id(.:format)  clients#update 
      DELETE /clients/:id(.:format)  clients#destroy 

Sehen Sie, wie beide clients (unter dem „Präfix“) entspricht GET für den Pfad /clients, und direkt darunter, gibt es ein unbenannter Eintrag für POST zu demselben /clients Pfad. Ganz rechts sehen Sie, dass die Methode GET an die Aktion clients#index weitergeleitet wird, während die Methode POST an die Aktion clients#create weitergeleitet wird.

In diesem Fall ist die Standardmethode button_toPOST, die versucht, die clients#create Aktion zu routen, was nicht das ist, was Sie tun wollten. Sie sollten fast nie direkt an die Methoden create, update oder destroy senden, und bei den wenigen Gelegenheiten, die Sie tun, werden Sie es sehr bewusst tun, und mit dem Wissen, dass es abnormal (nicht falsch, nur abnormal) Schienen ist Verwendung.

+0

Dies löste mein Problem, musste aber einige Änderungen vornehmen, anstatt '<% ​​= button_to (" Neuer Client ", clients_path, {methode:: get}, {: class =>" btn btn-lg btn-primary pull-right add-button "})%>', Ich musste die Route von 'clients_path' nach' new_client_path' und Methode und Klasse innerhalb derselben geschweiften Klammern wegen einer ungültigen Anzahl von Argumenten ändern. Am Ende funktionierte das folgendermaßen: '<% = button_to (" Neuer Client ", neuer_Client_Pfad, {Methode:: get, Klasse: 'btn btn-lg btn-primärer Pull-rechts-Add-Button'})%>'. Bearbeiten Sie die Antwort, um sie als beantwortet zu markieren. –

+0

@JorgeCuevas Tolles Feedback und vielen Dank, dass Sie mich wissen lassen! Ich habe die Antwort aktualisiert und ein wenig mehr Erklärungen zu den beiden Hashes für 'button_to' hinzugefügt. Das 'new_client_path'-Problem war ein Kopier-/Einfügefehler und das Problem mit den Hash-Optionen war ein falsches Lesen der Dokumentation. Diese sind jetzt aussortiert und können Sie bestätigen. Vielen Dank! –

+0

Alles scheint gut, hoffentlich wird dies anderen mit ähnlichen Problemen in der Zukunft helfen. Danke für deine Hilfe Michael, Markierung als beantwortet. –

1

Bitte überprüfen Sie Ihre routes.rb und stellen Sie sicher, dass Sie resources :clients hinzugefügt haben.

Sie sollten auch einen Blick auf die documentation werfen und sehen, dass Sie Ihre Route falsch aufrufen.

Ex. clients_new_path sollte new_client_path sein

Wenn Sie diese beiden Änderungen vornehmen und immer noch ein Problem haben. Es sieht so aus, als wäre der Fehler in Ihrem ClientsController.

Vergewissern Sie sich, dass Sie die Aktion create hinzugefügt haben.

def create 
@client = Client.new(client_params) 

if @client.save 
    flash[:notice] = 'App successfully created!' 
    redirect_to client_path(@client) 
else 
    flash[:error] = @app.errors.full_messages.join(', ') 
    render 'new' 
end 

Ende

+0

Die routes.rb-Datei enthält Ressourcen: Clients, die alle automatisch mit den get-Routen für jede Ansicht generiert werden. Ich habe versucht, zu new_client_path, aber es zeigt genau die gleiche Routing-Fehlermeldung. –

+0

Ich hatte es aber war leer. Es gefüllt, aber zeigt den gleichen Fehler. Fehle ich etwas in der Routes-Datei? –

+0

Der Controller und die Datei routes.rb wurden dem ursprünglichen Post hinzugefügt. –

1

Versuch auf diese Weise:

<%= button_to("New Client", new_client_path, :class => "btn btn-lg btn-primary pull-right add-button") %> 

Sie haben "Client" verwenden, nicht "Kunden" einen einzelnen Client

+0

Bereits als die vorherige Frage vorgeschlagen, zeigt immer noch den gleichen Fehler beim Anklicken. Bearbeitete den Beitrag, so dass er den aktuellen Stand des Problems anzeigt. –

+0

Können Sie Ihre client_conroller.rb veröffentlichen? –

+0

Hinzugefügt zum ursprünglichen Beitrag. –

Verwandte Themen