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:

  1. Listar todos os usuários
  2. Clique em "editar" em um usuário na lista
  3. O usuário clica em "Salvar" no formulário, os redirecionamentos controlador de volta para 1.

Exemplo 2:

  1. 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
  2. O usuário clica no link para editar
  3. 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:

  1. 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.
  2. O controlador salva os parâmetros para uma variável de sessão.
  3. 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:

  1. Coloque um before_filter sobre a ação "editar" para salvar a referência (isso é suficiente confiável?) Na sessão.
  2. 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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top