Как сделать очень индивидуальную проверку с помощью Ruby и «скрепки»?

В моем приложении RoR3 мне требуются специальные проверки для драгоценного камня «скрепка». Я должен вызывать их в точное время во время выполнения кода и только для проверки части полей формы (не всех полей в форме).

Итак, я сделал что-то, как описано ниже. Однако это не работает, вероятно, потому, что я не (и я не знаю, как) «заполнить» загружаемый файл (параметры «скрепки»), чтобы выполнить на нем собственную проверку.

Что я сделал:

В представлении:

<%= form_for(@account, :html => { :multipart => true }) do |f| %>
  ...
    <%= f.label :avatar %>
  ...
<% end %>

В контроллере:

...

update
  ...
  @account.validates_account_avatar(params[:account])
  ...
end

...

В модели:

  has_attached_file :avatar,
    :styles => {
      :thumb=> "100x100#",
      :small  => "150x150>" }

  def validates_account_avatar(account)
    allowed_mime_types = %w{"image/bmp", "image/gif", "image/jpeg", "image/png"} 
    max_size = 2048 

    self.errors.add( :avatar, "must be a file" ) if account[:avatar].blank?
    self.errors.add( :avatar, "isn't a valid image format") if allowed_mime_types.one? {|allowed_content_type| allowed_content_type.match(account[:avatar].content_type.to_s)}
    self.errors.add( :avatar, "is to big") if account[:avatar].size > max_size

    self.validate

    return true if self.errors.empty?
    return false
  end

Параметры отладки я получаю это:

... account"=>{"avatar"=>#<File:/tmp/RackMultipart20110119-94706-mxpg37>}, "commit"=>" ...

Конечно, если у вас есть лучший способ решить эту проблему, не стесняйтесь рекомендовать мне.


person user502052    schedule 18.01.2011    source источник


Ответы (1)


Вы можете выполнить каждую из этих проверок с уже существующими проверками скрепки.

validates_attachment_size

validates_attachment_content_type

проверяет_вложение_присутствия

это уже существующие проверки с помощью Paperclip, читайте: https://github.com/thoughtbot/paperclip.

person Rishav Rastogi    schedule 18.01.2011
comment
Я знаю! Мне нужен способ использовать эти проверки, как я описываю в вопросе. Я должен позвонить в определенное время. - person user502052; 19.01.2011
comment
Какая-то конкретная причина для этого? Если бы вы могли объяснить это в вопросе. Что касается меня, то, что вы делаете в этом методе, это одно и то же. Кроме того, вам не нужно возвращать true или false, если вы собираетесь добавить ошибку, если определенная проверка не удалась. - person Rishav Rastogi; 19.01.2011
comment
Вы можете просто запустить @account.valid? и выполнить эти проверки, чтобы не было таких накладных расходов. - person Rishav Rastogi; 19.01.2011
comment
Если какая-либо из этих проверок не пройдена. Это не позволит вам запустить, @account.update_attributes(params[:account]), также вернет false. - person Rishav Rastogi; 19.01.2011
comment
'@account.valid?' это нехорошо для меня, потому что я должен проверить только часть полей формы. - person user502052; 19.01.2011