如何从模型中引用资产管道中的图像?

时间:2011-09-01 08:16:54

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 asset-pipeline

我有一个模型,其中有一个方法可以将网址返回给人的头像,如下所示:

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

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

5 个答案:

答案 0 :(得分:20)

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

如果您希望默认网址与资产管道和资产同步相匹配,并且每种风格需要不同的默认图像,那么您需要生成没有指纹的资产路径,否则您将获得大量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),但必须关闭资产指纹/摘要。

只要您在没有摘要的情况下同步资产以及使用摘要的资产,这一切似乎都能正常工作。

答案 1 :(得分:8)

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

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

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

= avatar_or_default(@image)

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

答案 2 :(得分:6)

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

答案 3 :(得分:2)

Paperclip可以选择指定默认网址

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

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

答案 4 :(得分:1)

使用Rails主动存储,我通过以下方法解决了这个问题:

# 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 %>