E-mail:
<label for="job_client_email">Email: </label>
<input type="email" name="job[client_email]" id="job_client_email">
se parece com isso:
Mas, se a validação do email falhar, ela se tornará:
<div class="field_with_errors">
<label for="job_client_email">Email: </label>
</div>
<div class="field_with_errors">
<input type="email" value="wrong email" name="job[client_email]" id="job_client_email">
</div>
que se parece com isso:
Como eu poderia evitar essa mudança de aparência?
ruby-on-rails
ruby-on-rails-3
validation
field-with-errors
Misha Moroshko
fonte
fonte
Respostas:
Você deve substituir
ActionView::Base.field_error_proc
. Atualmente, é definido como este emActionView::Base
:Você pode substituí-lo colocando isso na classe do seu aplicativo dentro
config/application.rb
:Reinicie o servidor rails para que essa alteração entre em vigor.
fonte
label
quanto oinput
são embrulhados? Como o Rails decide o que embrulhar?f.label :password
ef.password_field :password
no caso@resource.errors
haveria um[:password]
conjunto de erros.A diferença visual que você está vendo está acontecendo porque o
div
elemento é um elemento de bloco. Adicione este estilo ao seu arquivo CSS para que ele se comporte como um elemento embutido:fonte
display:
propriedade que esteja sendo usada (e outros estilos de layout) nohtml_tag
.display
propriedade que está sendo usada antes da adição deste css é ablock
que está causando a diferença visual que não é desejada. Ele não nega nenhum outro estilo de layout na tag. No entanto, a resposta de Ryan Bigg é perfeita se você deseja alterar / remover a tag que envolve o campo com erros.Atualmente, uso esta solução, colocada em um inicializador:
Isso me permite apenas adicionar um nome de classe à tag apropriada, sem criar elementos adicionais.
fonte
label
.O código extra está sendo adicionado por
ActionView::Base.field_error_proc
. Se você não estiver usandofield_with_errors
para estilizar seu formulário, poderá substituí-lo emapplication.rb
:Como alternativa, você pode alterá-lo para algo adequado à sua interface do usuário:
fonte
Estou trabalhando com o Rails 5 e o Materialize-Sass e estou tendo alguns problemas com o comportamento padrão do Rails para tratar validações de campo com falha, como na imagem abaixo, e foi por causa do acréscimo
div
adicionado aos campos de entrada em que a validação falhou.Trabalhando com a resposta @Phobetron e modificando a resposta de Hugo Demiglio também. Fiz alguns ajustes nesses blocos de código e recebo algo funcionando bem nos seguintes casos:
input
elabel
tiver seu próprioclass
atributo em qualquer lugar<input type="my-field" class="control">
<label class="active" for="...">My field</label>
input
oulabel
não tiverem umclass
atributo<input type="my-field">
<label for="...">My field</label>
label
tag tiver outra tag dentro com oclass attribute
<label for="..."><i class="icon-name"></i>My field</label>
Em todos esses casos, a
error
classe será adicionada às classes existentes noclass
atributo, se existir, ou será criada se não estiver presente no rótulo ou nas tags de entrada .Espero que possa ser útil para alguém com as mesmas condições que eu.
fonte
Além da resposta @phobetron, que não funciona quando você tem outra tag com o atributo class, como
<label for="..."><i class="icon my-icon"></i>My field</label>
.Eu fiz algumas mudanças em sua solução:
fonte
Se, por algum motivo, você ainda estiver trabalhando no Rails 2 (como eu sou), confira o post aqui .
Ele oferece um script para colocar inicializadores.
fonte
Uma coisa a ter em mente (como eu descobri trabalhando nisso hoje) é que, se você flutuar nos campos label ou de entrada (estou flutuando todos os campos de entrada corretamente), o css será quebrado mesmo se você substituir o ActionView :: Base.field_error_proc.
Uma alternativa é reduzir um nível mais profundo na formatação CSS da seguinte forma:
fonte
Eu fiz uma opção para desativar essa coisa terrível para alguns objetos
Então, pode usá-lo assim:
fonte
Esta é a minha solução baseada na resposta do @ Phobetron. Ao inserir esse código
application.rb
, suas tags<p>
e<span>
geradas pelasform.error :p
chamadas correspondentes receberão afields_with_errors
tag css. O restante receberá aerror
classe CSS.Achei assim o mais flexível e discreto de todos os anteriores para modelar a resposta em meus formulários.
fonte
Se for apenas para fins de estilo (você não se importa
div
), basta adicionar isso ao seu css:Ele
div
funcionará como umspan
e não interferirá no seu design (já quediv
é um elemento de bloco -display: block;
- por padrão, causará uma nova linha após o fechamento;span
éinline
, portanto, não).fonte
Se você quiser apenas desativar os erros de certos elementos, por exemplo , caixas de seleção , faça o seguinte:
fonte
Se for apenas sobre problemas de estilo, podemos substituir "field_with_errors". Mas como isso pode afetar outros formulários em nosso aplicativo, é melhor substituir a classe "field_with_errors" somente nesse formulário.
Considerando 'parent_class' é uma das classes pai para o campo de erro do formulário (classe do formulário ou classe de qualquer elemento pai para o campo de erro),
Ele corrigirá o problema e também não perturbará outras formas em nosso aplicativo.
OU
Se precisarmos substituir o estilo de "field_with_errors" para todo o aplicativo, como @dontangg disse,
fará a correção. Espero que ajude :)
fonte
Se você não deseja alterar
field_error_proc
para todo o aplicativo, o desembrulhar do jQuery pode fornecer uma solução mais direcionada para áreas de problemas específicas, por exemplo,fonte