2009-03-21 17 views

risposta

2

Ok, quindi ho trovato una soluzione al mio problema. Ho trovato un'ottima recensione sulla situazione here. La mia applicazione si presenta così:

private 
def redirect_post(redirect_post_params) 
    controller_name = redirect_post_params[:controller] 
    controller = "#{controller_name.camelize}Controller".constantize 
    # Throw out existing params and merge the stored ones 
    request.parameters.reject! { true } 
    request.parameters.merge!(redirect_post_params) 
    controller.process(request, response) 
    if response.redirected_to 
    @performed_redirect = true 
    else 
    @performed_render = true 
    end 
end 

Poi ho chiamato questo metodo come questo:

redirect_post :controller => 'registrations', :action => 'order', :_method => 'put', :authenticity_token => params[:authenticity_token] 

quindi ero in grado di 'falso' una richiesta put facendo una richiesta POST (utilizzando redirect_post) e poi assegnare 'put' ad un parametro _method. Se si osserva una richiesta normale di put, si tratta di un valore post da un modulo con un parametro _method. Quindi è un po 'hacker ma fa il lavoro.

Inoltre, è necessario assicurarsi che quando si chiama redirect_post i valori del proprio hash siano stringhe altrimenti verranno generati errori.

+1

'controller.process' non funziona più nei binari 4 – josal

1

È possibile reindirizzare a una pagina diversa che emette la richiesta put dal client, using Javascript.

5

Non penso che tu sia in grado di farlo, e sospetto che la limitazione sia parte di HTTP stesso.

Quando si utilizza redirect_to - il reindirizzamento avviene come intestazione "302 Spostati", se non diversamente specificato nei parametri.

Dare un'occhiata alle specifiche HTTP non rivela alcun modo per modificare il tipo di richiesta effettuata dal browser tramite reindirizzamento.

HTTP Redirects:

Questa classe di codice di stato indica che ulteriore azione deve essere presa dal programma utente al fine di soddisfare la richiesta . L'azione richiesta MAY può essere eseguita dall'agente utente senza interazione con l'utente se e solo se il metodo utilizzato nella richiesta è GET o HEAD.

Penso che potrebbe essere necessario utilizzare JavaScript per ottenere questa funzionalità, o forse ripensare il flusso di controllo nella vostra applicazione.

2

Se l'azione è nella stessa controller come in cui si sta cercando di reindirizzare da, è sufficiente chiamare l'azione e rendere il modello in questo modo:

def show 
    index 
    render :action => "index" 
end 

Se non lo è, allora non lo so come farlo.

Problemi correlati