2016-07-11 12 views
0

Dies scheint, als sollte es eine einfache Sache sein, aber ich war nicht in der Lage, ein anschauliches Beispiel zu jagen. Entschuldigung, wenn diese Frage überflüssig ist.Rails "Select" -Form für Delete-Methode der RESTful-Ressource

So habe ich eine Rails App, und ich versuche, mit einer RESTful Ressource zu arbeiten. Dies ist, was die Route wie folgt aussieht:

config/routes.rb

resources :articles, only: [:index, :create, :destroy] 

ich eine einfache Form will diese im Fall Extras löschen hinzugefügt oder was auch immer. Also hier sind die Form und Controller habe ich bisher:

app/views/articles/_delete.html.haml

%h1 Delete Article 
- all_articles = Article.all.sort.reverse.map { |a| [a.name, a.id] } 
= form_for @article, method: :delete do |f| 
    .form-group 
    = f.select :id, options_for_select(all_articles), class: 'form-control' 
    = f.submit 'Delete', class: 'btn btn-danger' 

Als ich diese einreichen, erhalte ich ‚Keine Route treffer [ENTF] "/Artikel"'. Dies liegt daran, die Route zum Löschen ist Artikel /: id:

DELETE /articles/:id(.:format) articles#destroy 

Also mein Ziel ist es Taste der einreichen bekommen die ID zu packen, und abzuschicken zu/articles /: id mit der Delete-Methode. Wenn es hilft, bin ich auf Rails 4.1.

Ich denke, der wahre Schmerzpunkt für mich hier ist jedoch nicht vollständig zu verstehen, wie der Formularhelfer auf eine Aktion zeigt oder Daten umgibt. Wenn jemand aufklären kann, würde ich dankbar sein.

Ich sehe, dass ich eine URL auf der form_for Methode definieren kann, etwa so:

= form_for @article, method: :delete, url: articles_path do |f| 

Aber wie kann ich die ID aus der Form in diese URL bekommen?

Edit: Verwandte: https://github.com/rails/rails/issues/1769

+0

Sie sollten nicht DB-Aufruf in View-Datei schreiben. Sie können das Objekt '@articles = Article.all.sort.reverse.map {| a | erstellen [a.name, a.id]} 'und verwende das in der View-Datei. – Pramod

+0

Guter Punkt, wird es tun. – embell

Antwort

2

Bitte versuchen Sie es

= form_for @article, method: :delete, url: articles_path(@article) do |f| 

Und die url kann entfallen. Sie können versuchen, wie diese

= form_for @article, method: :delete do |f| 

Dank @unused

+0

Das ist richtig, die Route ist für eine einzige Ressource. Ich nehme an, Sie können die URL weglassen. – unused

+0

Muss @Article überhaupt rechtzeitig definiert werden? Ich versuche das, aber es versucht immer noch zu/Artikeln zu routen. – embell

+0

Es ist der gleiche '@ Artikel' Sie machen die' Form_for'. – Kumar