Ruby on rails 当文件未上载时,如何防止carrierwave将文件名字符串添加到已装载列?

Ruby on rails 当文件未上载时,如何防止carrierwave将文件名字符串添加到已装载列?,ruby-on-rails,activerecord,carrierwave,Ruby On Rails,Activerecord,Carrierwave,我正在使用Rails和ActiveRecord。 我已将carrierwave安装在型号(列表)的一列(:徽标)上。我的默认文件名是“disp\u logo”。假设我只做Listing.create在这种情况下,我没有真正上传任何文件。我没有做Listing.logo=或Listing.remote\u logo\u url=。但是,carrierwave仍然在:logo列中插入字符串“disp_logo”。为什么会这样?如何防止carrierwave这样做 我的uploader类具有以下方法:

我正在使用Rails和ActiveRecord。 我已将carrierwave安装在型号(
列表
)的一列(
:徽标
)上。我的默认文件名是
“disp\u logo”
。假设我只做
Listing.create在这种情况下,我没有真正上传任何文件。我没有做
Listing.logo=
Listing.remote\u logo\u url=
。但是,carrierwave仍然在
:logo
列中插入字符串
“disp_logo”
。为什么会这样?如何防止carrierwave这样做

我的uploader类具有以下方法:

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

def filename
  "disp_logo"
end
这就是我所说的默认文件名。
如果未上传图像,我希望列
:logo
具有
NULL
。相反,它有
“disp_logo”

似乎是您创建迁移时将“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
或者,如果您使用rails 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
编辑:

修改
文件名
方法如下:

  def filename
    "something.jpg" unless original_filename.nil?
  end

您创建迁移时似乎将“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
或者,如果您使用rails 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
编辑:

修改
文件名
方法如下:

  def filename
    "something.jpg" unless original_filename.nil?
  end

我想出了一个更适合我的用例的解决方案。

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
类LogoUploader

通过这种方式,我知道哪些记录已被处理
:logo#=>“disp#u logo”
,哪些记录失败
:logo#=>“失败”
,哪些记录尚未被处理
:logo#=>nil
我想出了一个更适合我的用例的解决方案。

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
类LogoUploader
通过这种方式,我知道哪些记录已被处理
:logo#=>“disp#u logo”
,哪些记录失败
:logo#=>“失败”
,哪些记录尚未被处理
:logo#=>nil
,谢谢!但我不是这个意思。我已经编辑了我的问题。谢谢!但我不是这个意思。我已经编辑了我的问题。