Подтвердить что ты не робот

Ruby on Rails 4 - Дублирование сообщений проверки подлинности скрепки

Есть ли способ предотвратить появление сообщений проверки, дважды появляющихся для проверки загрузки папок?

Вот моя модель:

has_attached_file :photo, :styles => { :thumb => "215x165" }, :default_url => "/images/:style/missing.png"

validates_attachment :photo, :presence => true,
:content_type => { :content_type => "image/jpg" },
:size => { :in => 0..0.5.megabytes }

Вот мой взгляд:

<% if @product.errors.any? %>
<p>The following errors were found:</p>
  <ul>
    <% @product.errors.full_messages.each do |message| %>
      <li>- <%= message %></li>
    <% end %>
  </ul>
<% end %>

Если я загружаю недопустимый файл, я получаю следующие сообщения об ошибках:

  • Недопустимый тип фотодокумента
  • Недопустимый снимок

Есть ли способ сделать только один из них? Я попытался добавить сообщение: к модели. Но тогда это просто появляется дважды!

Спасибо!

4b9b3361

Ответ 1

Если вы проверите хеш @model.errors, вы увидите, что он возвращает массив для атрибута: photo и сообщения для каждого проверяющего документа.

{:photo_content_type=>["is invalid"], 
 :photo=>["is invalid", "must be less than 1048576 Bytes"], 
 :photo_file_size=>["must be less than 1048576 Bytes"] }

Вам нужно будет отфильтровать одну партию с помощью Ruby. Есть много способов обойти это (см. здесь для некоторых идей), но быстрым решением может быть удаление массива: photo и использование только сообщений из скрепляемых скреплений атрибутов.

@model.errors.delete(:photo)

Это должно оставить вас с @model.errors.full_messages следующим образом:

["Photo content type is invalid", "Photo file size must be less than 1048576 Bytes"]

Ответ 2

По моему мнению, ниже лучшее решение

class YourModel < ActiveRecord::Base
  ...

  after_validation :clean_paperclip_errors

  def clean_paperclip_errors
    errors.delete(:photo)
  end
end

См. комментарий от @rubiety здесь

Ответ 3

Обратите внимание, что решения предыдущих ответов работают хорошо, пока вам не нужна проверка наличия. Это потому, что @model.errors.delete(: photo) удалит дубликаты, а также вашу проверку валидации присутствия. В приведенном ниже коде сохраняются ошибки проверки для атрибутов, указанных как аргумент метода preserve_specified_errors.

class YourModel < ActiveRecord::Base
  ...

  after_validation {
    retain_specified_errors(%i(attr another_att))
  }

  def retain_specified_errors(attrs_to_retain)
    errors.each do |attr|
      unless attrs_to_retain.include?(attr)
        errors.delete(attr)
      end
    end
  end
end