【问题标题】:Paperclip returning a url for non existing styles回形针返回不存在样式的 url
【发布时间】:2013-03-27 15:26:43
【问题描述】:

我在我的 Rails 模型中添加了回形针样式:

class Asset < ActiveRecord::Base

   has_attached_file :media,
                :styles => {:thumb => "100x100>"}
end

上传的新资产具有适当的拇指样式,这会返回正确的 url:

asset = Asset.last
asset.media(:thumb) = correct_url

但似乎即使是不存在的样式也会返回一个 url:

asset = Asset.last
asset.media(:foobar) = some_url

我正在向我的模型添加新样式,例如“大”,如果以前保存的模型实例不存在该样式,我希望它返回错误或空字符串。

如果实例不存在样式,如何让回形针返回空字符串?

asset = Asset.last #doesn't have style foobar
asset.media(:foobar) = ''   #or could return an error

谢谢。

【问题讨论】:

    标签: ruby-on-rails paperclip


    【解决方案1】:

    我不确定我是否明白你到底想要什么。

    如果您想在请求 JUST WRONG 样式的 url 时得到一个错误/空字符串(即开发人员拼写错误),那么您可以尝试以下操作。

    默认情况下,它只是替换您在has_attached_file 中指定的标签。见interpolate方法。

    看起来可以使用选项更改此默认行为。您需要实现与Paperclip::Interpolations 类似的类。请参阅self.default_optionshere:interpolator 适合你。

    另一方面,如果您想为特定附件的缺失样式获取空 url(即正确,但由于某种原因文件不存在 - 也许您只是添加了新样式),那么:

    我猜这可能会影响性能(即使用文件系统甚至外部服务)。因此,对于通用用法不是一个好主意。

    您可能应该在添加新样式时考虑运行 rake 任务。 Paperclip 已经有 rake paperclip:missing_styles (on github) 来执行此操作。但这可能是一个运行时间很长的任务(例如,我的托管服务器在完成之前杀死了 rake 进程)。

    如果性能对您来说不是问题,您可以再次制作自己的插值器。

    【讨论】:

    • 谢谢。是的,你的第二种情况就是我想要的。我添加了一种新样式。如果我询问该样式的 url 路径,但该特定附件不存在该样式,为什么我得到一个 url 路径?
    • 所以,正如我在回答中所写的 - 这是回形针的默认实现。您可以使用自己的插值器覆盖它,就像在第一种情况下一样。
    • 谢谢你的解释,denis-bu
    【解决方案2】:

    如果实例的样式不存在,如何获得回形针到 返回一个空字符串?

    在这种简单的情况下,将:default_url 设置为"" 应该可以工作:

    class Asset < ActiveRecord::Base
      has_attached_file :media, :styles => {:thumb => "100x100>"}, :default_url => ""
    end
    

    【讨论】:

    • 我想我只是对它返回任何东西感到惊讶。如果我添加新样式,我不希望以前保存的附件在请求该附件不存在的样式时返回任何内容。
    • 如果我是正确的, :default_url 如果附件完全丢失(即您没有分配给模型的图片)。因此,与缺少样式无关。
    【解决方案3】:

    我不认为 :default_url 会处理这种情况,我必须检查一下。但是当我真的需要知道一种样式是否存在时,我为您的情况所做的事情如下:

    flavor = (Faraday.head(post.photo.url(:output)).status == 200) ? :output : :original
    url = post.photo.url(flavor)
    

    它会下载您喜欢的文件,因此请记住这一点。这还假设您不想使用回形针 rake 任务重新处理所有现有附件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多