2016-04-07 6 views
1

Ich versuche, eine Dropdown-Liste mit Zuständen und bevölkert über die db zu erstellen. Beim Senden möchte ich, dass die App auf die Showroute für Staaten verweist. Leider bekomme ich einen Fehler.Create Rails Formular, das um Route von einer anderen Ressource anzuzeigen durch Auswahl ID

Die routes.rb Datei enthält:

Rails.application.routes.draw do 
    get 'app/index' 

    resources :states 
    root 'beerfinder#index' 
end 

Die Staaten Controller enthält:

class StatesController < ApplicationController 
    def show 
     @state = State.find(params[:id]) 
    end 
end 

Die App Controller

class AppController < ApplicationController 
    def index 
    @states = State.all 
    end 
end 

Meine Form für die index.html.erb ist :

<%= form_for :states, :url => states_path(@state) do |f| %> 
    <%=select_tag 'state', options_from_collection_for_select(@states, 'id', 'full_name')%> 
    <%= f.submit "Submit" %>    
<% end %> 

Die State-Tabelle enthält die Felder id und full_name. Derzeit sucht das Formular nach der Create-Route. Wie mache ich diese Route zur Statusansicht, ohne js zu verwenden?

Antwort

2

Es ist normal für states_path, um die Index Aktion auf dem Controller für eine 'Get' Anfrage zu routen. Sie würden den Routenhelfer state_path verwenden, um zur Aktion show zu gelangen. Aber der Routenhelfer state_path erfordert, dass die ID der Ressource angezeigt wird. Sie wissen das nicht auf der Formularebene, da das select-Tag viele Optionen mit jeweils einer anderen ID enthält.

Der normale Weg, auf die Show-Aktion von einer resources :states-Route aus zuzugreifen, ist, die ID im URL-Pfad zu haben, z. /states/101.

Mithilfe von <form> und <select> wird ein URL-Parameter in der Anforderung generiert. Sie benötigen etwas wie /states/show?id=101.

Die folgenden Werke, aber ich bin nicht sicher, ob es der Rails-y Weg, es zu tun:

eine neue Make '/ Staaten/show' alternative Route in routes.rb (ohne: id in die URL) vor die resources :states Route:

get 'states/show', to: 'places#show' 
resources :states 

Dann wird Ihr form_for wird ein form_tag (weil Sie nicht mit einer einzigen Ressource arbeiten):

form_tag :url => states_show_path, :method => :get 

Und Ihre select_tag ändert, so dass es eine ‚id‘ URL param übermittelt:

select_tag :id, options_from_collection_for_select(@states, 'id', 'full_name') 

Es wäre mit JavaScript (mit maßgeschneiderten Routen kein Herumspielen) einfacher sein, aber das ist die beste nicht-JS Lösung, die ich denken kann.

+0

Also, die Get-Anfrage hat versucht und zeigte es auf die Index-Aktion, so dass es nicht ganz da war. Ich habe versucht, es in 'State_path' zu ändern und es jetzt Fehler beim Versuch, das Formular No Route übereinstimmt {: Action => "Show",: Controller => "Staaten",: ID => Nil} fehlt erforderliche Schlüssel: [: id] – notthehoff

+1

Ich sehe das Problem, ich werde die Antwort in Kürze aktualisieren. –

+1

Danke, dass du dir ein paar Gedanken darüber gemacht hast und wenn es keine normale Schienenmagie dafür gibt, denke ich, dass ich einfach die Route gehen und deiner Einschätzung zustimmen kann, dass es einfacher ist, das zu tun. – notthehoff

Verwandte Themen