na minha página de edição do usuário, há uma linha da seguinte maneira:
<%= devise_error_messages! %>
O problema é que isso não gera erros da maneira padrão que o restante do aplicativo:
<% flash.each do |key, value| %>
<div class="flash <%= key %>"><%= value %></div>
<% end %>
Minha pergunta é: como faço para que a mensagem de erro do dispositivo funcione como as outras que usam o flash.each?
Obrigado.
ruby-on-rails
devise
Um aprendiz
fonte
fonte
Respostas:
Estou tentando descobrir isso sozinho. Acabei de encontrar este problema registrado no Github https://github.com/plataformatec/devise/issues/issue/504/#comment_574788
Jose está dizendo que o
devise_error_messsages!
método é apenas um esboço (embora contenha implementação) e que devemos substituí-lo / substituí-lo. Teria sido bom se isso fosse apontado em algum lugar do wiki, e é por isso que acho que existem algumas pessoas como nós que têm adivinhado.Então, vou tentar reabrir o módulo e redefinir o método, substituindo efetivamente a implementação padrão. Eu vou deixar você saber como vai.
Atualizar
Sim, isso funciona. Eu criei
app/helpers/devise_helper.rb
e substituí-lo da seguinte forma:Então, sabendo disso, posso modificar o método para exibir as mensagens de erro da maneira que desejo.
Para ajudá-lo a resolver seu problema original: Aqui está o original
devise_helper.rb
no Github . Veja como as mensagens de erro estão sendo percorridas:Isso deve ajudar você a começar. :)
Outra atualização
O
resource
objeto é, na verdade, o modelo que está sendo usado pelo dispositivo (veja a figura).Também parece estar definido em um escopo mais alto (provavelmente vindo do controlador), para que possa ser acessado em vários locais.
Em qualquer lugar do seu auxiliar
Sua visão
fonte
A solução abaixo funciona com a versão mais recente a partir de agora (4.1.1) e o Rails 4.2.6. Mas é tão simples que não vejo a razão pela qual não funcionaria daqui a 10 anos;)
Se você deseja reciclar suas mensagens de erro e fazer com que elas tenham a mesma aparência em seu aplicativo, eu recomendaria algo assim (como aprendi com o tutor de Michael Hartl):
Crie parcial para mensagens de erro:
layouts/_error_messages.html.erb
Coloque o seguinte código (aqui eu uso algumas classes de autoinicialização 3):Agora você tem algo reciclável e pode usá-lo em geral. Em vez do modelo padrão:
Chame-o em seu formulário como este:
Você pode colocá-lo de qualquer forma. Em vez de passar o recurso do dispositivo, você pode passar variáveis do seu formulário da seguinte maneira:
fonte
Eu sei que já faz um tempo desde que essa pergunta foi publicada, mas eu só queria comentar o que encontrei. As duas pessoas que já responderam foram uma tremenda ajuda para mim e eu só queria contribuir.
Você verá no Devise que existem chamadas usando
render_with_scope
. Eu acredito que este é um método definido pelo dispositivo e basicamente aplica o escopo atual à próxima visualização renderizada.Por que isso é relevante? O dispositivo contém seus erros dentro
resource.errors
( não@resource.errors
). O Devise funciona bem se você quiser usá-lo imediatamente, por assim dizer.Problemas com esses erros surgem se você começar a alterar seu comportamento de gerenciamento de usuários. Ao adicionar um
redirect_to
ourender
(em vez derender_with_scope
) onde o Devise anteriormente não tinha um, você basicamente estará descartando as mensagens de erro. Isso torna o Devise hostil à modificação, na minha opinião.Minha solução é essa
e
O último bloco de código pega as mensagens de erro do Devise como uma matriz e as anexa a
flash[:notice]
(como uma matriz). Cada mensagem será impressa uma linha de cada vez. Se eu tiver tempo, acho que vou mudar a maneira como o Devise lida com as mensagens de erro para fazer isso em todo o meu aplicativo, pois parece muito mais limpo ter um sistema de mensagens de erro em vez de dois.fonte
Eu resolvi isso da mesma forma que o YoyoS, criando
app/helpers/devise_helper.rb
e colocando isso nele:Trabalhou!
fonte
Eu só quero trazer um novo pedacinho aqui:
Então, achei uma maneira mais fácil de obter o resultado que "AnApprentice" queria.
Antes de tudo, se você deseja personalizar qualquer coisa no plug-in Devise, recomendo que você copie o código de "\ Ruby_repertory \ lib \ ruby \ gems \ 1.9.1 \ gems \ devise-version \ app \ controllers | helpers | mailers ... "para o arquivo que você deseja em seu projeto.
[Editar] Ou você pode herdar seu arquivo dos arquivos de criação "normais" ... Como ... digamos ... Você deseja substituir apenas uma função dentro de devise / registrations_controller.rb, a primeira linha do seu costume de Usuários controlador de registros seria:
Agora, o Devise fornece uma ferramenta para gerar controladores: https://github.com/plataformatec/devise/wiki/Tool:-Generate-and-customize-controllers
Então ... enfim ... consegui obter o que "AnApprentice" queria escrever apenas isso (para uma solução mais limpa, veja a grande edição a seguir):
E, na minha opinião, as próximas linhas funcionaram muito bem:
Bem ... então você pode acessar os erros de um atributo específico como este:
E ... Um pequeno truque para exibir apenas um erro (o primeiro a ser capturado) por atributo:
Eu sei que já faz um tempo desde que essa pergunta foi publicada, mas acho que isso ajudará muitos usuários inventores :).
Grande edição:
Como adoro estender meu código, tornando-o mais limpo e compartilhá-lo com outras pessoas, recentemente desejei alterar as devise_error_messages! para usá-lo em meus pontos de vista e mostrar o truque que expliquei acima.
Então, aqui está o meu método:
Não é grande coisa aqui, reutilizei o código que escrevi na minha exibição para mostrar apenas um atributo pey de erro, porque geralmente o primeiro é o único relevante (como quando o usuário esquece um campo obrigatório).
Estou contando esses erros "únicos" e estou criando um título HTML H2 usando o pluralize e colocando-o ANTES da lista de erros.
Então agora eu posso usar o "devise_error_messages!" como o padrão e renderiza exatamente o que eu já estava renderizando antes.
Se você deseja acessar uma mensagem de erro específica em sua exibição, agora recomendo usar diretamente "resource.errors [: attribute] .first" ou qualquer outra coisa.
Seya, Kulgar.
fonte
Estou usando o Devise no Rails 3 e seu código flash é praticamente idêntico ao que eu tenho. No meu aplicativo, o código funciona conforme o esperado; ou seja, as mensagens de erro do Devise são enviadas com o restante das minhas mensagens em flash:
Experimente este código exato e veja se faz alguma diferença - o atributo de ID diferente pode ajudar.
fonte
Eu vim para isso e está funcionando até agora. Isso adiciona mensagens planejadas ao flash, para que ele possa ser usado como de costume. Por favor, considere que eu sou novo no Ruby and Rails ...
Editar:
Desculpe, eu estava correndo em guarda e algum comportamento indesejado estava presente. Desde que
after_filter
é chamado após a renderização, para que não funcione conforme o esperado. Se alguém souber como chamar um método após a ação, mas antes da renderização ...Mas você pode usar algo assim:
No
views/shared/_messages.html.erb
fonte
Se você deseja exibir mais de um flash de um determinado tipo (: alerta,: aviso, etc ...) e não perder seu tempo tentando modificar o comportamento de uma gema, esta é a solução que usei com o Devise. Tenho certeza de que poderia ser usado com qualquer jóia que use mensagens em flash.
A primeira coisa a fazer, no seu application_controller.rb, adicione isto:
Segunda coisa a fazer, exibindo suas mensagens em flash com isso em application.html.erb (ou onde você quiser):
Terceira coisa a fazer, sempre que você quiser adicionar uma mensagem flash em qualquer controlador, faça o seguinte:
fonte
Crie o DeviseHelper:
Na sua opinião, substitua
Para:
fonte
É certo que um pouco hacky, mas estou usando este auxiliar (app / helpers / devise_helper.rb) para capturar flashes e usá-los se definido como padrão
resource.errors
. Isso é baseado apenas no ajudante que está na lib ideal.fonte
Se você estiver olhando para pegar devise_error_messages, poderá adicioná-lo a resource.errors
Se você passasse por cima do controlador de registro, pode parecer
fonte
Maneira muito fácil de exibir mensagem de erro para cada campo
coloque para cada campo com o nome do campo entre colchetes abaixo de cada linha em que você deseja exibir a mensagem de erro em linha.
fonte
Para mostrar seu erro de projeto do seu controlador com apenas o primeiro erro para aparecer.
fonte
Apenas para adicionar à resposta de Eric Hu acima, onde todas as instruções If são usadas, faça algo assim.
fonte
Eu simplesmente faço isso, trabalhei para mim: em app / helpers / , crio um arquivo devise_helper.rb
em todos os arquivos de visualização eu mudo
para:
para mim, fazer na minha opinião editar e novo usuário:
espero que ajude você;)
fonte
<%= devise_error_messages! %>
que não responde à pergunta. A pergunta pergunta como aplicar o flash a cada mensagem.fonte
Eu gosto de fazê-lo exatamente como foi feito no outro controlador Devise com esse truque.
fonte
Para materialisecss exibir mensagens de erro planejadas como brinde, adicionei este código em app / helpers / devise_helper.rb
Tenho certeza de que a maneira mais limpa de escrevê-lo, mas está funcionando perfeitamente
fonte
DeviseHelper#devise_error_messages!
foi descontinuado e será removido na próxima versão principal.O Devise agora usa um parcial
devise/shared/error_messages
para exibir mensagens de erro por padrão e torná-las mais fáceis de personalizar. Atualize suas visualizações alterando as chamadas de:para:
fonte
Eu apenas criei um
app/helpers/devise_helper.rb
como John, mas substitui o método assim:Com isso, não preciso modificar mais nada. É uma má ideia ? Eu sou novo nos trilhos, não hesite em me corrigir. Obrigado.
fonte
Acabei de declarar devise_error_messages! como um ajudante vazio. E manualmente buscou e manipulou os erros em geral _erros parciais para o meu aplicativo. Parecia a solução mais simples e não preciso examinar todos os arquivos do dispositivo e remover a chamada para o manipulador de erros.
fonte