Как запретить перевозчику добавлять строку имени файла в смонтированный столбец, когда файл не загружен? - PullRequest
1 голос
/ 01 декабря 2011

Я использую Rails и ActiveRecord.У меня есть несущая волна, установленная на одной из колонн (:logo) модели (Listing).Мое имя файла по умолчанию "disp_logo".Допустим, я просто делаю Listing.create! В этом случае я не загружал ни одного файла.Я не делал Listing.logo=<some file> или Listing.remote_logo_url=<some url>.Но, carrierwave по-прежнему вставляет строку "disp_logo" в столбец :logo.Почему это так?Как я могу предотвратить использование несущей на этом месте?

Мой класс загрузчика имеет следующие методы:

def store_dir
  "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end

def filename
  "disp_logo"
end

Это то, что я подразумеваю под именем файла по умолчанию.Я хочу, чтобы в столбце :logo было NULL, если изображение не загружено.Вместо этого он имеет "disp_logo".

Ответы [ 2 ]

1 голос
/ 01 декабря 2011

Казалось бы, вы создали свою миграцию с "disp_logo" в качестве значения по умолчанию для вашего столбца. Вместо этого вы должны установить изображение по умолчанию в загрузчике, например так:

  # Provide a default URL as a default if there hasn't been a file uploaded:
  def default_url
    "/" + [version_name, "disp_logo.jpg"].compact.join('_')
  end

Или, если вы используете рельсы 3.1 и конвейер ресурсов:

  # Include the Sprokets helpers for Rails 3.1+ asset pipeline compatibility:
  include Sprockets::Helpers::RailsHelper
  include Sprockets::Helpers::IsolatedHelper

  # Provide a default URL as a default if there hasn't been a file uploaded:
  def default_url
    asset_path [version_name, "disp_logo.jpg"].compact.join('_')
  end

Edit:

Измените ваш filename метод следующим образом:

  def filename
    "something.jpg" unless original_filename.nil?
  end
0 голосов
/ 15 декабря 2011

Я нашел решение, которое лучше подходит для моего варианта использования.

class LogoUploader < CarrierWave::Uploader::Base
  attr_accessor :upload_failed

  def filename
    upload_failed ? "failed" : "disp_logo"
  end
end

class SomeModel < ActiveRecord::Base
  mount_uploader :logo, LogoUploader

  def some_method_that_assigns_a_file_and_uploads_it
    self.remote_logo_url = <some_url>
                  OR
    self.logo = <some file>
    <some_other_logic>
    save!
  rescue
    logo.upload_failed = true
    save!
  end
end

Таким образом, я знаю, какие записи были обработаны :logo #=> "disp_logo", какие записи не прошли :logo #=> "failed", а какие еще не обработаны :logo #=> nil

...