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

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),但必须关闭资产指纹/摘要.

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

  • Rails 4,Paperclip,这已经不再需要了.`:default_url =>":style/missing.jpg"`.没有领先的`/`. (3认同)

Pet*_*ter 9

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

= image_tag(@image.avatar_url || 'none.png')
Run Code Online (Sandbox Code Playgroud)

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

= avatar_or_default(@image)
Run Code Online (Sandbox Code Playgroud)

当像这样的东西在铁轨上很难时,它通常表明它并不完全正确.

  • 我经常在json中使用它(通过as_json),它取消了该选项. (3认同)

Mic*_*ley 6

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

  • 我相信Draper可以使获得与上述@iain相同的帮助方法变得更加容易。引入Draper只是为了使您可以访问该助手是一个过大的杀伤力,但是如果有必要将其他逻辑转移到演示者中,那么可以肯定-继续吧。 (2认同)