Eu tenho uma página que lista todos os projetos que possuem cabeçalhos e paginação classificáveis.
path:
/projects?order=asc&page=3&sort=code
Eu escolho editar um dos projetos
path:
projects/436/edit
Quando clico em salvar nessa página, ele chama o método de controlador / atualização de projetos. Depois de atualizar o código, quero redirecionar para o caminho em que estava antes de clicar em editar um projeto específico. Em outras palavras, eu quero estar na mesma página com a mesma classificação.
Eu vi link_to (: back) e pensei que: back pode funcionar em redirect_to (: back), mas isso não é possível.
puts YAML::dump(:back)
yields the following:
:back
Alguma idéia de como eu poderia fazer isso funcionar. Parece um problema que seria facilmente resolvido, mas sou novo no RoR.
fonte
redirect_to session.delete(:return_to)
na ação de atualização. Isso limpa o valor da sessão, pois não é mais necessário.redirect_to request.referer
?request.referer.referer
, se isso fosse possível. @Jaime Bellmyer Por quê||=
?Por que
redirect_to(:back)
não funciona para você, por que é impossível?redirect_to(:back)
funciona como um encanto para mim. É apenas um atalho pararedirect_to(request.env['HTTP_REFERER'])
http://apidock.com/rails/ActionController/Base/redirect_to (anterior ao Rails 3) ou http://apidock.com/rails/ActionController/Redirecting/redirect_to (Rails 3)
Observe que
redirect_to(:back)
está sendo descontinuado no Rails 5. Você pode usarredirect_back(fallback_location: 'something')
em vez disso (consulte http://blog.bigbinary.com/2016/02/29/rails-5-improves-redirect_to_back-with-redirect-back.html )fonte
redirect_to :back
também não funciona bem, digamos que você visite/posts/new
, isso é definido como referenciador para a próxima solicitação; portanto, após o envio do formulário com êxito, ele mostra o formulário novamente, ou seja/posts/new
. No entanto, funciona bem para outros fins.redirect_to projects_path
.HTTP_REFERER
não estiver definido, você pode obterActionController::RedirectBackError
, precisaria resgatar dessa exceção nesse caso. Pelo meu entendimento, o usoredirect_back
não requer nenhum tratamento de exceção, pois você é forçado a fornecerfallback_location
. Talvez 'não funcione bem' não seja o caminho certo para colocá-lo.Eu gosto do método de Jaime, com uma exceção, funcionou melhor para mim re-armazenar o referenciador toda vez:
O motivo é que, se você editar vários objetos, sempre será redirecionado de volta para o primeiro URL que você armazenou na sessão com o método de Jaime. Por exemplo, digamos que eu tenho objetos Apple e Orange. Eu edito a Apple e
session[:return_to]
me coloco no referenciador dessa ação. Quando for editar laranjas usando o mesmo código,session[:return_to]
não será definido porque já está definido. Portanto, quando eu atualizar o Orange, serei enviado ao referenciador da ação de edição anterior da Apple #.fonte
É assim que fazemos em nossa aplicação
Dessa forma, você armazena apenas a última solicitação GET nos
:return_to
parâmetros da sessão, para que todos os formulários, mesmo quando várias vezes o POST, funcionassem:return_to
.fonte
request.request_uri
não está mais disponível, então eu sugiro usarrequest.fullpath
vezand
eor
emif
declarações. Use&&
e em||
vez disso. Detalhes aqui .No trilhos 5, conforme as instruções nos Guias do Rails, você pode usar:
O local 'back' é extraído do cabeçalho HTTP_REFERER, que não é garantido como definido pelo navegador. É por isso que você deve fornecer um 'fallback_location'.
fonte
notice
objeto com aredirect_back
instrução para informar ao usuário que algo deu errado com uma mensagem em flash?redirect_back(fallback_location: root_path, notice: "Something went wrong!")
. Espero que possa ajudar de alguma forma.request.referer
é definido pelo rack e é da seguinte maneira:Basta fazer um
redirect_to request.referer
e ele sempre será redirecionado para a página de referência verdadeira ou para o root_path ('/'). Isso é essencial ao passar por testes que falham nos casos de navegação direta para uma página específica na qual o controlador lança um redirect_to: backfonte
referer
foi assim que foi definido em 28 de março de 2011 e é assim que é definido hoje . Ou seja,|| '/'
não faz parte da definição.Para quem estiver interessado, aqui está minha implementação, estendendo a resposta original do MBO (escrita nos trilhos 4.2.4, ruby 2.1.5).
fonte