22

我有一个模型,该模型具有将 url 返回到一个人的头像的方法,如下所示:

 def avatar_url
   if self.avatar?
     self.avatar.url # This uses paperclip
   else
     "/images/avatars/none.png"
   end
 end

我正在升级到 3.1,所以现在需要通过资产管道引用硬编码的无图像。在控制器或视图中,我只需将其包装在 中image_path(),但模型中没有该选项。如何生成正确的图片网址?

4

5 回答 5

20

我挣扎了一段时间,所以我想我会在这里发布答案。虽然以上适用于标准默认图像(即每种回形针样式相同),但如果您需要多个默认样式,则需要不同的方法。

如果你想让默认 url 与资产管道和资产同步配合得很好,并且希望每种样式有不同的默认图像,那么你需要生成没有指纹的资产路径,否则你会得到很多 AssetNotPrecompiled 错误。

像这样:

   :default_url => ActionController::Base.helpers.asset_path("/missing/:style.png", :digest => false)

或在您的回形针选项中:

   :default_url => lambda { |a| "#{a.instance.create_default_url}" }

然后是模型中具有回形针附件的实例方法:

def create_default_url
   ActionController::Base.helpers.asset_path("/missing/:style.png", :digest => false)
end

在这种情况下,您仍然可以使用插值 (:style),但必须关闭资产指纹/摘要。

只要您同步没有摘要的资产以及具有摘要的资产,这一切似乎都可以正常工作。

于 2012-10-24T16:22:44.060 回答
9

就个人而言,我不认为你真的应该把这个默认值放在模型中,因为它是一个视图细节。在您的(haml)视图中:

= image_tag(@image.avatar_url || 'none.png')

或者,创建您自己的助手并像这样使用它:

= avatar_or_default(@image)

当这样的事情在轨道上很困难时,这通常表明它并不完全正确。

于 2011-09-01T08:24:55.227 回答
6

我们使用 draper 解决了这个问题:https ://github.com/jcasimir/draper 。Draper 让我们在我们的模型周围添加一个包装器(用于视图中),它可以访问帮助器。

于 2011-09-19T21:17:55.587 回答
2

Paperclip 有一个选项来指定默认 url

has_attached_file :avatar, :default_url => '/images/.../missing_:style.png'

如果用户尚未上传头像,您可以使用它来提供默认图片。

于 2011-09-01T08:59:35.630 回答
1

使用 rails active storage 我通过这样做解决了这个问题:

# Post.rb
def Post < ApplicationRecord
    has_one_attached :image

    def thumbnail
        self.image.attached? ? self.image.variant(resize: "150x150").processed.service_url : 'placeholder.png';
    end

    def medium
        self.image.attached? ? self.image.variant(resize: "300x300").processed.service_url : 'placeholder.png';
    end

    def large
        self.image.attached? ? self.image.variant(resize: "600x600").processed.service_url : 'placeholder.png';
    end
end

然后在您看来,只需调用: <%= image_tag @post.thumbnail %>

于 2019-02-02T02:41:53.747 回答