Melhor maneira de condicional Redirect? [fechadas]
-
02-07-2019 - |
Pergunta
Usando Rails v2.1, digamos que você tenha uma ação para um controlador que é acessível a partir de mais de um local. Por exemplo, dentro do aplicativo Rails, você tem um link para editar um usuário a partir de dois pontos de vista diferentes, um na visão de usuários índice, e outro de outra visão (digamos a partir da barra de navegação em cada página).
Eu estou querendo saber qual é a melhor maneira de redirecionar parte de trás do usuário para o local certo, dependendo do que ligar que clicou. Por exemplo:
Exemplo 1:
- Listar todos os usuários
- Clique em "editar" em um usuário na lista ??li>
- O usuário clica em "Salvar" no formulário, os redirecionamentos controlador de volta para 1.
Exemplo 2:
- O usuário poderia ser em qualquer página dentro do aplicativo, os shows barra de navegação um link para editar o usuário atual
- O usuário clica no link para editar
- O usuário clica em "Salvar" no formulário, redirecionamentos controlador de volta para qualquer página que estavam em quando o usuário clicou no link "editar" na barra de navegação.
Eu já vi isso feito no passado por:
- A colocação de um parâmetro no link Editar original com o controlador / ação original no qual o link apareceu. Para tornar isso mais seco, você poderia usar @ controller.controller_name e @ controller.action_name em um ajudante.
- O controlador salva os parâmetros para uma variável de sessão.
- Uma vez que o controlador salvou o registro, ele redireciona para a variável de sessão.
O que eu particularmente não gosto sobre esta solução é a necessidade de adicionar o parâmetro para cada ligação aplicáveis ??nas vistas. Eu estou querendo saber se existe uma maneira de construir tudo isso no controlador.
Uma melhor maneira que eu estava pensando era:
- Coloque um before_filter sobre a ação "editar" para salvar a referência (isso é suficiente confiável?) Na sessão.
- Quando o "update" é atingido, o controlador irá redirecionar para a variável de sessão e exclua a variável de sessão.
Qualquer pensamento sobre a melhor maneira de fazer isso?
Solução
Eu acho que o uso de before_filter na ação de edição é o menos intrusivos.
O referer deve ser suficiente confiável ... simplesmente ter um padrão no caso de não referer estar disponível (dizer: alguém marcada a página de edição) e você deve ser fino.
Outras dicas
Flash : Os dados que você vai usar apenas para o próximo pedido pode ser armazenada em flash. Então você não tem que percorrer cerca de limpá-lo automaticamente. Ele funciona bem para bits limitadas de contexto de aplicação que você está certo para única necessidade uma vez - não apenas para mensagens de erro!
Eu sei o que você fez de acesso última HTTP : Se você só precisa redirecionar as pessoas para o último URL eles estavam em, em seguida, basta fazer isso. request.referer vai, para a maioria dos browers que não bloqueiam a informação, dar-lhe o último URL a pessoa estava.
#in edit controller
...
flash[:page_to_redirect_to] = request.referer || "/my/default/path"
...
#in save controller
redirect_to flash[:page_to_redirect_to] || "/my/default/path"
Eu não sugeriria hardcoding aqueles, aliás.
before_filter : Eu vejo um monte de desenvolvedores Rails usando este como seu martelo favorito e transformando tudo em unhas. Os filtros são úteis quando você deseja expor a funcionalidade de todos ou substancialmente todos os métodos em um controlador. Eu não sei o que é necessariamente o caso aqui, mas sua milhagem pode variar. Você pode combinar o filtro com o acima de dois truques se justifica.
Outra abordagem é para carregar o formulário em uma sobreposição, como http://flowplayer.org/ ferramentas / sobreposição / index.html , e depois sobre ajax enviar você pode fechar a sobreposição. Eu faço isso em combinação com um autocomplete para oferecer uma opção "add new". Uma vez que o formulário de sobreposição é submetido, eu voltar alguns dados em JSON, que seja cumprida para preencher o preenchimento automático. (Eu fiz o meu próprio plug-in para ajudar com tudo o que)
É preciso um trabalho pouco mais, mas ele realmente funciona bem para o usuário final.