我有一个模型,其中有一个方法可以将网址返回给人的头像,如下所示:
def avatar_url
if self.avatar?
self.avatar.url # This uses paperclip
else
"/images/avatars/none.png"
end
end
我正在升级到3.1,所以现在需要通过资产管道引用硬编码的无图像。在控制器或视图中,我只需将其包装在image_path()
中,但我在模型中没有该选项。如何为图像生成正确的URL?
答案 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 %>
,