Usando o Rails, estou tentando receber uma mensagem de erro como "O campo da música não pode estar vazio" ao salvar. Fazendo o seguinte:
validates_presence_of :song_rep_xyz, :message => "can't be empty"
... exibe apenas "O representante da música XYW não pode estar vazio", o que não é bom porque o título do campo não é amigável. Como posso alterar o título do próprio campo? Eu poderia alterar o nome real do campo no banco de dados, mas tenho vários campos de "música" e preciso ter nomes de campos específicos.
Não quero invadir o processo de validação dos trilhos e acho que deve haver uma maneira de corrigir isso.
fonte
errors.add :base, msg
? Gostaria de saber de qual coluna se trata o erro, para que eu possa exibi-lo no campo de formulário correto.The password is wrong.
ou emThe email address is not valid.
vez dePassword is wrong.
eEmail is not valid.
.No seu modelo:
Na sua opinião
Se você fizer isso
você recebe essa mensagem de erro com o nome do atributo
se você deseja receber a mensagem de erro para um único atributo
fonte
validates_presence_of :address1, :message => :put_some_address_please
Tente isso.
Eu encontrei isso aqui .
Aqui está outra maneira de fazer isso. O que você faz é definir um método human_attribute_name na classe de modelo. O método recebe o nome da coluna como uma sequência e retorna a sequência a ser usada nas mensagens de validação.
O código acima é daqui
fonte
Sim, há uma maneira de fazer isso sem o plugin! Mas não é tão limpo e elegante quanto usar o plugin mencionado. Aqui está.
Supondo que seja o Rails 3 (não sei se é diferente nas versões anteriores),
mantenha isso em seu modelo:
e na vista, em vez de sair
como seria quando usamos o gerador de andaimes, coloque:
E você receberá apenas a mensagem especificada no modelo, sem o nome do atributo.
Explicação:
Até agora, estamos apenas exibindo apenas uma mensagem, sempre para o primeiro erro. Se você deseja exibir todos os erros, pode fazer um loop no hash e mostrar os valores.
Espero que tenha ajudado.
fonte
Código Rails3 com mensagens totalmente localizadas:
No modelo user.rb, defina a validação
Em config / locales / en.yml
fonte
No método de validação customizado, use:
errors.add(:base, "Custom error message")
como add_to_base foi descontinuado.
errors.add_to_base("Custom error message")
fonte
Relacionado à resposta aceita e outra resposta na lista :
Estou confirmando que o fork do nanamkim de custom-err-msg funciona com o Rails 5 e com a configuração da localidade.
Você só precisa iniciar a mensagem de localidade com um sinal de intercalação e ela não deve exibir o nome do atributo na mensagem.
Um modelo definido como:
com o seguinte
en.yml
:item.errors.full_messages
Exibirá:em vez do habitual
Name You can't create an item without a name
fonte
Eu recomendo instalar a gem custom_error_message (ou como um plug - in ) originalmente escrita por David Easley
Permite fazer coisas como:
fonte
gem "custom_error_message"
ao seu Gemfile - ver github para mais detalhesUma solução pode ser alterar o formato de erro padrão do i18n:
O padrão é
format: %{attribute} %{message}
fonte
Aqui está outra maneira:
Se você usar este modelo:
Você pode escrever sua própria mensagem personalizada como esta:
Dessa forma, devido ao sublinhado, a mensagem completa se torna "Minha mensagem personalizada", mas o espaço extra no início é imperceptível. Se você realmente não quer esse espaço extra no começo, basta adicionar o
.lstrip
método.O método String.lstrip se livra do espaço extra criado por ': _' e deixa inalteradas outras mensagens de erro.
Ou melhor ainda, use a primeira palavra da sua mensagem personalizada como chave:
Agora a mensagem completa será "Minha mensagem personalizada" sem espaço extra.
Se você deseja que a mensagem completa comece com uma palavra em maiúscula como "O URL não pode ficar em branco", isso não pode ser feito. Em vez disso, tente adicionar outra palavra como chave:
Agora a mensagem completa será "O URL não pode ficar em branco"
fonte
errors.add(:_, 'foobar')
e receber 'foobar' como a mensagemApenas faça da maneira normal:
Mas exiba assim
Devoluções
O método de localização é definitivamente a maneira "correta" de fazer isso, mas se você estiver fazendo um projeto pequeno e não global e quiser apenas avançar rapidamente - isso é definitivamente mais fácil do que o salto de arquivos.
Eu gosto da capacidade de colocar o nome do campo em outro lugar que não seja o início da string:
fonte
Se você quiser listá-los todos em uma lista legal, mas sem usar o nome não amigável, você pode fazer isso ...
fonte
Na sua opinião
Quando você deseja substituir a mensagem de erro sem o nome do atributo, basta preceder a mensagem com ^ assim:
fonte
Eu tentei seguir, trabalhou para mim :)
1 job.rb
2 jobs_controller.rb
3 _form.html.erb
fonte
Aqui está o meu código que pode ser útil para você, caso você ainda precise: Meu modelo:
Então eu criei um auxiliar para mostrar mensagens:
fonte
A única maneira de obter toda a personalização que eu queria era usar um
after_validation
retorno de chamada para me permitir manipular a mensagem de erro.Permita que a mensagem de validação seja criada normalmente, não é necessário tentar alterá-la no auxiliar de validação.
crie um
after_validation
retorno de chamada que substitua a mensagem de validação no back-end antes de chegar à exibição.No
after_validation
método, você pode fazer o que quiser com a mensagem de validação, como uma string normal! Você pode até usar valores dinâmicos e inseri-los na mensagem de validação.O método after_validation terá um escopo muito maior do que o auxiliar de validação de rails embutido, portanto, você poderá acessar o objeto que está validando como está tentando fazer com object.file_name. O que não funciona no auxiliar de validação em que você está tentando chamá-lo.
Nota: usamos o
^
para se livrar do nome do atributo no início da validação, como @Rystraum apontou fazendo referência a esta gemafonte
A resposta de graywh é a melhor se ela realmente for diferente da localização do nome do campo. No caso de um nome de campo dinâmico (com base em outros campos a serem exibidos), eu faria algo assim
o método full_message no else é o que os rails usam dentro do método full_messages; portanto, ele fornece os erros normais do Rails para outros casos (Rails 3.2 e superior)
fonte