Como você pode fazer redirect_to usar uma solicitação HTTP diferente?
-
21-08-2019 - |
Pergunta
No final de uma das minhas ações de controlador eu preciso redirecionar para uma página que só aceita pedidos colocados. I foram tentando descobrir como obter redirect_to usar um pedido de venda, mas sem sucesso.
Isso é possível? Ou existe outra maneira de conseguir isso?
Solução 3
Ok, então eu encontrei uma solução para o meu problema. Eu encontrei um muito bom escrever sobre a situação aqui . Minha implementação esta aparência:
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
Então eu chamei esse método como este:
redirect_post :controller => 'registrations', :action => 'order', :_method => 'put', :authenticity_token => params[:authenticity_token]
Então, eu era capaz de 'fake' um pedido put fazendo uma solicitação post (usando redirect_post
) e, em seguida, atribuindo 'put' para um param _method
. Se você olhar para um pedido put
normal de tudo, é um post
a partir de um formulário com um param _method
. Isso é um pouco hackish, mas ele começa o trabalho feito.
Além disso, você tem que ter certeza que quando você chamar redirect_post
os valores de sua haxixe são strings caso contrário os erros serão jogados.
Outras dicas
Eu não acho que você é capaz de fazer isso, e eu suspeito que a limitação é parte de HTTP em si.
Ao usar o redirect_to -. O redirecionamento acontece como "302 movido" cabeçalho salvo indicação em contrário nos parâmetros
Ter um olhar para o Spec HTTP em si não revela nenhuma maneira de mudar o tipo de solicitação o navegador faz através de redirecionamento.
Esta classe de código de status indica que novas necessidades de ação a ser tomada pelo agente de utilizador, a fim de cumprir o pedido. A ação necessária MAIO ser levada a cabo pelo agente de utilizador sem interacção com o utilizador, se e apenas se o método utilizado no segundo pedido é GET ou HEAD.
Eu acho que você pode precisar usar JavaScript para atingir essa funcionalidade, ou talvez repensar o fluxo de controle em sua aplicação.
Se a ação está no mesmo controlador como onde você está tentando redirecionar a partir, basta ligar para a ação e tornar o modelo da seguinte forma:
def show
index
render :action => "index"
end
Se não é, então eu não sei como fazer isso.
Você pode redirecionar para uma página diferente que emite o pedido de venda do cliente, usando Javascript .