如何在Rails引擎中覆盖carrierwave的default_url方法

时间:2014-03-19 10:33:51

标签: ruby-on-rails carrierwave rails-engines

我有一个Rails引擎,它使用carrierwave并提供自己的默认图像。

我想在宿主应用程序中覆盖此默认图像,因此需要覆盖上传者的default_url方法。

这似乎并不像看起来那么简单,我认为它可能与如何安装carrierwave卸载器有关。打开课程并添加新版本的方法似乎不起作用。

有关如何实现这一目标的任何想法?

4 个答案:

答案 0 :(得分:1)

default_url 方法可用于设置资产的默认值(如果不存在)。

class MyUploader < CarrierWave::Uploader::Base
  def default_url(*args)
    "/images/fallback/" + [version_name, "default.png"].compact.join('_')
  end
end

这适用于所有版本。如果要为不同版本设置不同的默认值,则可以覆盖此方法

class MyUploader < CarrierWave::Uploader::Base
  # this will work for all version
  def default_url(*args)
    "/images/fallback/" + [version_name, "default.png"].compact.join('_')
  end

  version :thumbnail do
    # this will work for thumbnail version only.
    def default_url(*args)
        "assets/thumb.png"
    end
  end
end

答案 1 :(得分:0)

The documentation指出覆盖上传器类中的default_url方法应该是微不足道的。事实上,default method是空白的。

class MyUploader < CarrierWave::Uploader::Base
  def default_url
    ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
  end
end

如果这不起作用,可能还有其他问题,例如需要重新启动服务器,或运行bundle clean等。

答案 2 :(得分:0)

有多个版本的解决方案而不是version_name,就像这样使用它

ActionController::Base.helpers.asset_path("dashboard/" + [@mounted_as, "file_name.png"].compact.join('_'))

在@mounted_as中,您将获得版本

的符号

例如

version :person_image

@mounted_as将是:person_image

玩得开心=)

答案 3 :(得分:-1)

您可以覆盖store_dir方法来更改图片的网址。

class MyUploader < CarrierWave::Uploader::Base
  def store_dir
    'public/my/upload/directory'
  end
end
你可以在这里找到:

https://github.com/carrierwaveuploader/carrierwave#changing-the-storage-directory