2011-01-16 1 views
8

Ho 2 azioni - Modifica e aggiornamento. Il modulo in Modifica invia i valori all'azione Aggiorna. Quando il salvataggio di un modello fallisce, eseguo il rendering del riquadro di modifica, in cui l'utente vede gli errori e i campi sono precompilati con ciò che ha precedentemente compilato. C'è un enorme ma per me - nel pannello URL nel browser dell'utente c'è/utente/aggiornamento, anche quando (e perché) I reso modello di modifica. Posso in qualche modo cambiarlo passando alcuni parametri per renderizzare il metodo nell'azione di aggiornamento? Non voglio che l'utente veda che c'è qualche azione (di aggiornamento) oltre alla modifica. È possibile?Render modello e modifica stringa url nel browser?

risposta

1

Ci sono due modi per aggirare questo:

1) reindirizzamento dal azione di aggiornamento di nuovo all'azione di modifica, invece di rendere il modello, e passare i messaggi di errore e gli attributi che si desidera utilizzare per popolare la oggetto che si sta modificando. Ciò comporterà l'URL essere/utente/modifica.

2) Inviare all'azione di modifica anziché all'azione di aggiornamento e rimuovere completamente l'azione di aggiornamento. Puoi usare request.post? nell'azione di modifica per verificare se la richiesta è un post o ottenere la richiesta e quindi eseguire l'aggiornamento e modificare le azioni utilizzando la stessa definizione di funzione.

 
def edit 
    @user = User.find(params[:id]) 
    if request.post? 
    @user.update_attributes params[:user] 
    ... 
    else 
    ... 
    end 
end 

NOTA: Occorre tuttavia tenere presente che non si può mai veramente nascondere l'azione POST dal client perché possono sempre visualizzare il codice sorgente e vedere l'azione a cui stai scrivendo nel modulo.

+1

Quando si esegue l'opzione 1, si finisce con un URL come 'articoli/1/edit? Messages =% 23 'e gli errori non sono mostrati. – Cameron

6

Ecco il terzo modo per aggirare questo:

Nella tua routes.rb

resources :users 
match 'users/:id/edit' => 'users#update', :via => :put, :as => :put_user 

Secondo lei (edit.html.erb per esempio)

<%= form_for @user, :url => put_user_path do |f| %> 
    ... 
<% end %> 

nel controller (users_controller.rb per esempio)

def update 
    @user = User.find(params[:id]) 
    if @user.update_attributes(params[:user]) 
    ... 
    else 
    render 'edit' 
    end 
end 
+0

Questo ha funzionato bene. Grazie. –

0

Un po 'più moderna versione in base alla risposta del CL Chang

resources :jobs, except: [:update] do 
    member do 
     patch 'edit', action: :update, :as => :update_edit 
    end 
end 

Questo genera tutti i percorsi rilassanti standard, fatta eccezione per il percorso di aggiornamento standard. (Se non si desidera che tutte le azioni, quindi è possibile utilizzare only: [<your routes not including :update>]

Inoltre, genera

update_edit_job PATCH /jobs/:id/edit(.:format) 

Ora basta aggiornare il modulo per specificare il percorso

<%= form_for @job, :url => update_edit_job_path do |f| %> 
    ... 
<% end %> 

così , invece di inviare a/update via patch, va a/jobs // edit via patch, e questo colpisce l'azione di aggiornamento

ora se c'è un errore, è possibile eseguire il rendering di modifica, e tutto Gli errori saranno visibili - ma l'utente non noterà che l'url è diverso da quello di modifica (perché solo il metodo è diverso)

def update 
    @job = Job.find(params[:id]) 
    if @job.update_attributes(user_params) 
    #redirect somewhere??? 
    else 
    render 'edit' 
    end 
end