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_to
POST
, 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.
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. –
@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! –
Alles scheint gut, hoffentlich wird dies anderen mit ähnlichen Problemen in der Zukunft helfen. Danke für deine Hilfe Michael, Markierung als beantwortet. –