Mic*_*ley 22 ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 asset-pipeline
我有一个模型,其中有一个方法可以将url返回给人的头像,如下所示:
def avatar_url
if self.avatar?
self.avatar.url # This uses paperclip
else
"/images/avatars/none.png"
end
end
Run Code Online (Sandbox Code Playgroud)
我正在升级到3.1,所以现在需要通过资产管道引用硬编码的无图像.在控制器或视图中,我只是将其包装image_path(),但我在模型中没有该选项.如何为图像生成正确的URL?
Iai*_*ain 20
我努力让这一段时间保持正确,所以我想我会在这里发布答案.虽然以上适用于标准默认图像(即每个回形针样式都相同),但如果您需要多种默认样式,则需要采用不同的方法.
如果您希望默认网址与资产管道和资产同步相匹配,并且每种风格需要不同的默认图像,那么您需要生成没有指纹的资产路径,否则您将获得大量AssetNotPrecompiled错误.
像这样:
:default_url => ActionController::Base.helpers.asset_path("/missing/:style.png", :digest => false)
Run Code Online (Sandbox Code Playgroud)
或在您的回形针选项中:
:default_url => lambda { |a| "#{a.instance.create_default_url}" }
Run Code Online (Sandbox Code Playgroud)
然后是模型中具有回形针附件的实例方法:
def create_default_url
ActionController::Base.helpers.asset_path("/missing/:style.png", :digest => false)
end
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您仍然可以使用插值(:style),但必须关闭资产指纹/摘要.
只要您在没有摘要的情况下同步资产以及具有摘要的资产,这一切似乎都能正常工作.
就个人而言,我认为你不应该把这个默认值放在模型中,因为它是一个视图细节.在你的(haml)视图中:
= image_tag(@image.avatar_url || 'none.png')
Run Code Online (Sandbox Code Playgroud)
或者,创建自己的帮助程序并像这样使用它:
= avatar_or_default(@image)
Run Code Online (Sandbox Code Playgroud)
当像这样的东西在铁轨上很难时,它通常表明它并不完全正确.
我们使用draper解决了这个问题:https://github.com/jcasimir/draper.Draper让我们在可以访问帮助程序的模型周围添加一个包装器(用于视图).