Qual è il modo migliore per instradare un controller statica in Rails?
-
24-09-2019 - |
Domanda
Ho uno static_controller che si occupa di tutte le pagine statiche del sito e funziona come segue in routes.rb:
map.connect ':id', :controller => 'static', :action => 'show'
Ho una pagina statica chiamato a tale proposito tra le altre informazioni, ha un modulo di contatto. Al momento ho un contacts_controller che si occupa di inserire le informazioni di contatto nel database. Dentro il mio file routes.rb, ho:
map.resources :contacts
Il mio modulo di contatto (semplificato) assomiglia a questo:
<% form_for @contact do |f| %>
<p class="errors"><%= f.error_messages %></p>
<p>
<%= f.label :first_name %>
<%= f.text_field :first_name %>
</p>
<p class="buttons"><%= f.submit %></p>
<% end %>
Che a sua volta si sottomette alla creazione di azione del mio contacts_controller. I miei creare look d'azione come questo:
def create
@contact = Contact.new(params[:contact])
if @contact.save
flash[:notice] = "Email delivered successfully."
end
redirect_to "about"
end
Il problema è, è la che quando ho reindirizzare indietro alla mia pagina sulle messaggi_errore per la forma si perdono (dal momento che i messaggi_errore per la forma esistono solo per una richiesta, e che la richiesta estremità su reindirizzamento). Come potrei fare per preservare i messaggi_errore ed ancora che collega gli utenti all'URL di statico? Sarebbe una sessione / flash essere sufficiente (in caso affermativo, quale codice dovrei usare per passare i messaggi di errore) o sto andare su questo tutta la cosa sbagliata?
Grazie!
Soluzione
Credo che quello che potrebbe essere in corso è necessario per eseguire il rendering piuttosto che di reindirizzamento. Redirect termina la richiesta, e dice al cliente di fare una nuova richiesta a un indirizzo diverso. Che perderà i vostri errori. Se il tentativo fallisce salvare la vostra voglia di completare la richiesta rendendo nuovamente l'azione con gli errori indicati.
def create
@contact = Contact.new(params[:contact])
if @contact.save
flash[:notice] = "Email delivered successfully."
redirect_to @contact #make a new request for the address of the new record or some other address if you want
else
render :action => "new" #complete the request by rendering the new action with the @contact variable that was just created (including the @errors).
end