Rails-валидация изображения simple_form - PullRequest
2 голосов
/ 17 августа 2011

У меня проблема с тем, что моя simple_form требует как поля загрузки файла изображения, так и ввода URL изображения.

Как проверить, чтобы в обоих случаях требовалось указывать либо поле загрузки файла изображения, либо URL-адрес изображения.

My View в другом контроллере:

            <%= f.simple_fields_for :photo_attributes do |d| %>
<%= d.label :image, :label => 'Upload logo'  %>
<%= d.file_field :image, :label => 'Image'  %>
<%= d.input :image_url, :label => 'Billed URL' %>
<% end %>

Моя фотомодель:

require 'open-uri'

class Photo < ActiveRecord::Base
  belongs_to :virksomhed
  attr_accessor :image_url

  has_attached_file :image,
                  :url  => "/public/images/billeder/photo/:id/:basename.:extension",
                  :path => ":rails_root/public/images/:id/:basename.:extension"

  before_validation :download_remote_image, :if => :image_url_provided?

  validates_presence_of :image_remote_url, :if => :image_url_provided?, :message => 'is invalid or inaccessible'

private

  def image_url_provided?
    !self.image_url.blank?
  end

  def download_remote_image
    self.image = do_download_remote_image
    self.image_remote_url = image_url
  end

  def do_download_remote_image
    io = open(URI.parse(image_url))
    def io.original_filename; base_uri.path.split('/').last; end
    io.original_filename.blank? ? nil : io
  rescue # catch url errors with validations instead of exceptions (Errno::ENOENT, OpenURI::HTTPError, etc...)
  end

end

Ответы [ 3 ]

2 голосов
/ 20 декабря 2013

Правильная форма: : with =>% r {. (png | jpg | jpeg) $} i,

В противном случае это позволит file.git.something

1 голос
/ 24 июля 2012
validates :image_url, allow_blank: true, format: {
  with: %r{\.gif|jpg|png}i,
  message: 'must be a url for gif, jpg, or png image.'
}
1 голос
/ 01 октября 2011

Если вы говорите о маркировке полей, обязательных для представления, SimpleForm помечает каждое поле как обязательное (*) по умолчанию.Так говорится в файле readme, в комплекте с примером того, как это переопределить (обязательно => false).

В вашей модели я бы сделал что-то вроде:

validate_presence_of :file_field, :unless => :image_url_provided?
...