Come si può fare redirect_to utilizzare una richiesta HTTP diverso?
-
21-08-2019 - |
Domanda
Al termine di una delle mie azioni di controllo ho bisogno di reindirizzare a una pagina che accetta solo richieste PUT. Ho cercato di capire come ottenere redirect_to utilizzare una richiesta put, ma senza alcun successo.
È possibile? O c'è un altro modo per ottenere questo?
Soluzione 3
Ok, così ho trovato una soluzione al mio problema. Ho trovato un ottimo scrittura sulla situazione qui . 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]
Così sono stato in grado di 'falso' una richiesta put facendo una richiesta POST (utilizzando redirect_post
) e poi l'assegnazione di 'mettere' a un param _method
. Se si guarda a un normale put
richiesta di tutto si tratta di un post
da un modulo con un param <=>. Così la sua un po 'hacker ma ottiene il lavoro fatto.
Inoltre, è necessario fare in modo che quando si chiama <=> i valori della vostra hash sono stringhe altrimenti saranno gettati errori.
Altri suggerimenti
Non credo che siete in grado di fare questo, e ho il sospetto che la limitazione è parte di HTTP per sé.
Quando si utilizza redirect_to -. Il reindirizzamento avviene come "302 Spostato" header salvo diversamente specificato nei parametri
Avere uno sguardo al HTTP Spec in sé non rivela alcun modo per cambiare il tipo di richiesta il browser effettua tramite reindirizzamento.
Questa classe di codice di stato indica che l'ulteriore azione deve essere presa dal programma utente al fine di adempiere la richiesta. L'azione richiesta MAGGIO essere effettuata dal programma utente senza interazione con l'utente se e solo se il metodo utilizzato nella seconda richiesta è GET o HEAD.
Credo che potrebbe essere necessario utilizzare JavaScript per ottenere questa funzionalità, o forse ripensare il flusso di controllo nell'applicazione.
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 so come farlo.
Si potrebbe reindirizzare a una pagina diversa che emette la richiesta put da parte del cliente, utilizzando Javascript .