Validação personalizada - Mensagem de erro

178 views
Skip to first unread message

Lorena Danielle

unread,
Oct 8, 2013, 11:01:19 AM10/8/13
to rail...@googlegroups.com
Bom dia,

Estou com uma dificuldade para exibir uma mensagem de erro.

O problema é o que é mostrado na mensagem de erro. No model é feito uma validação se um arquivo anexado é suspeito, no caso, se termina com .exe, .com, .bat.. antes de fazer o upload.

Model:
validate :suspitious_attachment
  private

  def suspitious_attachment
    #testes
    if ends_with? '.bat', '.com', '.exe', '.src', '.cmd'
      errors.add(:base, I18n.t('errors.messages.suspitious_attachment', :value => attachment.path[-4..-1]))
      errors.add('', I18n.t('errors.messages.suspitious_attachment', :value => attachment.path[-4..-1]))
      errors.add_to_base(I18n.t('errors.messages.suspitious_attachment', :value => attachment.path[-4..-1]))
      errors.add(:attachment_file_name, I18n.t('errors.messages.suspitious_attachment', :value => attachment.path[-4..-1]))
      errors.add(:name, I18n.t('errors.messages.suspitious_attachment', :value => attachment.path[-4..-1]))
    end
  end


Ao tentar fazer o upload de um arquivo terminado .com, por exemplo, aparecem as seguintes mensagens:
  • Attachments base não é permitido upload de .com
  • Anexos não é permitido upload de .com
  • Attachments attachment file name não é permitido upload de .com
  • Attachments name não é permitido upload de .com

O resultado esperado seria apenas: não é permitido upload de .com, mas em todas as tentativas variando a sintaxe apareceu pelo menos uma palavra antes.

Pelo que eu encontrei nos foruns e em um dos guias do rails:

A solução correta apresentada teria o seguinte formato: errors.add(:base, "Mensagem")
Nesse caso, só deveria exibir o conteúdo da mensagem, o que não está ocorrendo.

Chequei a versão suportada do rails pela aplicação: rails (4.0.0, 3.2.13, 3.2.6, 3.0.10), o errors.add deveria funcionar uma vez que serve para as versões acima de 3.0.

Alguem já teve algum problema similar ou pode me ajudar?

Obgda






Everaldo Gomes

unread,
Oct 8, 2013, 11:05:45 AM10/8/13
to rail...@googlegroups.com
Já tentou isso?

7.4 errors[:base]
You can add error messages that are related to the object's state as a whole, instead of being related to a specific attribute. You can use this method when you want to say that the object is invalid, no matter the values of its attributes. Since errors[:base] is an array, you can simply add a string to it and it will be used as an error message.

  errors[:base] << "This person is invalid because ..."


2013/10/8 Lorena Danielle <lorena...@base2.com.br>
--
--
Você recebeu essa mensagem porquê está inscrito no Google
Groups "rails-br".
Para enviar uma mensagem para o grupo, mande um email para rail...@googlegroups.com
Para se descadastrar, mande um e-mail para
rails-br+u...@googlegroups.com
Visite o grupo em http://groups.google.com/group/rails-br?hl=pt-BR
Leia nossa política de uso: http://goo.gl/YGgt7
 
---
Você está recebendo esta mensagem porque se inscreveu no grupo "rails-br" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para rails-br+u...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.

Kleber Shimabuku

unread,
Oct 8, 2013, 7:02:28 PM10/8/13
to rail...@googlegroups.com
Boa noite Lorena,

Tente usar "full_messages".


Ex:

model.errors.full_messages


[]s

Lorena Danielle

unread,
Oct 9, 2013, 8:40:11 AM10/9/13
to rail...@googlegroups.com
Obgda pelas respostas, nenhum dos dois funcionou, me parece que é o problema pode ser no arquivo de tradução.

Quando eu utilizo o full_messages, o arquivo é anexado, já o errors[:base] retorna uma mensagem semelhante as demais.

Tem uma coisa estranha, no arquivo de tradução tem os códigos:
activerecord:
...
  attributes:
...
  issue:
  attachments: "Anexos"


Se eu acrescentar uma nova linha, por exp:
activerecord:
...
  attributes:
...
  issue:
  attachments: "Anexos"
  base: "teste"

e no model:
errors.add(:base, "texto a a ")

A mensagem retornada é: 
  • Attachments base texto a a

Mas se eu mudar esta linha: 
attachments: "Anexos"
para por exp: attachments: "Anexos - teste"

e no model:
errors.add('', I18n.t('errors.messages.suspitious_attachment', :value => attachment.path[-4..-1]))
o resultado é: 
  • Anexos - teste não é permitido upload de .com

Mesmo que eu mude o primeiro parametro do errors.add, ele associa ao attachments do translate O.o

Kleber Shimabuku

unread,
Oct 9, 2013, 12:06:30 PM10/9/13
to rail...@googlegroups.com
Lorena,

Sua mensagem está confusa, mas até onde sei, o "base" não deve ser incluido no arquivo de tradução.

Você deve estar querendo algo como:

errors.add(:attachment, "não é permitido upload de", :value => file_extension)

eu acho o arquivo de locales é um pouco confuso, verifique se o aninhamento está correto.

ex:

model:
  attribute:



Lorena Danielle

unread,
Oct 11, 2013, 7:15:47 AM10/11/13
to rail...@googlegroups.com
Na verdade o que eu quero fazer é mostrar uma mensagem de erro que estou passando no segundo parâmetro.
O erro até agora é que não apenas aparece a mensagem do segundo parâmetro mas também umas palavras antes.

errors.add(:attachment, "não é permitido upload de", :value => file_extension)
retorna: 
Attachments attachment file name não é permitido upload de .com
 
errors.add(:base, "não é permitido upload de", :value => file_extension)
retorna:
Attachments base file name não é permitido upload de .com
 
O que eu quero exibir é apenas: "Não é permitido upload de..."

Hoje vou tentar arrumar isso, realmente acho que deve ser no arquivo de tradução, se eu conseguir, posto aqui.

Em terça-feira, 8 de outubro de 2013 12h01min19s UTC-3, Lorena Danielle escreveu:

Everaldo Gomes

unread,
Oct 11, 2013, 7:25:20 AM10/11/13
to rail...@googlegroups.com
Lorena, pode ser a maneira como você renderiza os erros.

Poste o código da view ou layout que imprime as mensagens...

Acho que vem uma hash attr, message. Basta imprimir apenas message.


2013/10/11 Lorena Danielle <lorena...@base2.com.br>

Lorena Danielle

unread,
Oct 11, 2013, 7:39:01 AM10/11/13
to rail...@googlegroups.com
Oi,

A view está assim:

  <% if @issue.errors[:attachments].any? %>
  <div class="clearfix error">
  <% else %>
  <div class="clearfix">
  <% end %>
    <label>
        <%= image_tag 'icons/required.png', :alt => '*' %><%= t('labels.attachments') %>
    </label>
    <div class="input">
      <div class="inputs-list">
        <%= f.fields_for :attachments do |builder| %>
          <%= render 'attachment_fields', :f => builder %>
        <% end %>
        <%= f.link_to_add t("actions.add_another_attachment"), :attachments, :class => "icon-attach" %>
        <% if @issue.errors[:attachments].any? %>
            <%= content_tag :span, t('errors.messages.blank'), class: 'help-inline error' %>
        <% end %>
      </div>
    </div>
  </div>



Everaldo Gomes

unread,
Oct 11, 2013, 8:15:29 AM10/11/13
to rail...@googlegroups.com
Olá!
Só enxerguei isto:
            <%= content_tag :span, t('errors.messages.blank'), class: 'help-inline error' %>

Mas não faz muito sentido pra mim.

Pode mandar o layout?

Não precisa ser tudo...só um trecho de errrors, flash message...

Afinal, não quero ver o "segredo industrial" dos outros...

Só o trecho relevante.


2013/10/11 Lorena Danielle <lorena...@base2.com.br>

Lorena Danielle

unread,
Oct 11, 2013, 8:35:04 AM10/11/13
to rail...@googlegroups.com
Não sei se é isto que vc quer ver, mas segue abaixo alguns trechos:
flash:
<% request.flash.each do |name, msg| %>
  <%= content_tag :div, :class => "alert-message alert-floating fade in #{name}", 'data-alert' => true do %>
    <a class="close" href="#">×</a>
    <p><%= msg.html_safe %></p>
  <% end %>
<% end %>

errors:
<% if target.errors.any? %>
  <div class="alert-message fade in warning">
    <a class="close" href="#">×</a>
    <p><%= target.errors.full_messages.first %></p>
  </div>
<% end %>



Everaldo Gomes

unread,
Oct 11, 2013, 8:53:33 AM10/11/13
to rail...@googlegroups.com
Oi! Infelizmente, não vou ter tempo para responder hoje, só colocar um comentário rapidinho:

    <p><%= target.errors.full_messages.first %></p>

Acho que o erro está ali. Estude o comportamento do full_messages e veja se ele faz o que você espera. Veja se há alternativas na exibição de erros. Eu costumava ver um loop....

Att.

Everaldo




2013/10/11 Lorena Danielle <lorena...@base2.com.br>

Lorena Danielle

unread,
Oct 11, 2013, 8:56:52 AM10/11/13
to rail...@googlegroups.com
Tudo bem, já me ajudou bastante, estava procurando o erro em outro lugar.

Vou estudar e testar.
Muito obrigada =]


Em terça-feira, 8 de outubro de 2013 12h01min19s UTC-3, Lorena Danielle escreveu:

Lorena Danielle

unread,
Dec 6, 2013, 6:21:53 AM12/6/13
to rail...@googlegroups.com
Antes tarde do que nunca =]

Bom, consegui resolver da seguinte forma:
Removi a validação da classe issue_attachment e a coloquei na classe issue, dessa forma a mensagem de forma correta só é mostrada ao lado do campo.
Adicionei um método na classe issue_attachment que retorna apenas a extensão do arquivo.

Na classe issue, adicionei um método para fazer a validação, caso seja uma extensão perigosa é exibido a extensão do arquivo.


Em terça-feira, 8 de outubro de 2013 12h01min19s UTC-3, Lorena Danielle escreveu:

Everaldo Gomes

unread,
Dec 6, 2013, 7:10:43 AM12/6/13
to rail...@googlegroups.com
Legal!


2013/12/6 Lorena Danielle <lore...@gmail.com>
Reply all
Reply to author
Forward
0 new messages