在回形针中指定missing.png

Posted

技术标签:

【中文标题】在回形针中指定missing.png【英文标题】:Specifying missing.png in Paperclip 【发布时间】:2011-09-15 01:42:26 【问题描述】:

我正在使用 Paperclip 在我的应用中处理个人资料照片上传。他们上传得很好,并根据我的模型中的规格调整大小。但是,如果用户的个人资料 :photo 为零,无论我尝试什么,我都无法更改默认值。这是我要使用的代码:

<% if @profile.photo.nil? %>
<%= image_tag "public/images/example.jpg", :html =>  :id => "noUserProfile"  %>
<% else %>
<%= image_tag @profile.photo.url(:normal) %>
<% end %>

我已经尝试过“../public/images/example.jpg”,即使我的公共图像文件夹中有“example.jpg”,这也不起作用。当我在视图中复制图像地址时,我得到:

http://localhost:3000/photos/normal/missing.png

我将这些文件夹添加到我的应用程序中,并在其中放置了一个 missing.png 文件,但什么也没有。如果我转到上面的 URL,我会得到 No route matches "/photos/normal/missing.png"

有人对发生的事情有任何想法吗?

has_attached_file 在 Profile 模型中:

has_attached_file :photo,
  :styles => 
  :normal => "153x220#",
  :small => "75x108#" 

add_attachment_photo_to_profile 迁移:

class AddAttachmentPhotoToProfile < ActiveRecord::Migration
  def self.up
    add_column :profiles, :photo_file_name, :string
    add_column :profiles, :photo_content_type, :string
    add_column :profiles, :photo_file_size, :integer
    add_column :profiles, :photo_updated_at, :datetime
  end

  def self.down
    remove_column :profiles, :photo_file_name
    remove_column :profiles, :photo_content_type
    remove_column :profiles, :photo_file_size
    remove_column :profiles, :photo_updated_at
  end
end

这是在 :photo 存在时呈现的 HTML:

<div class="userSnapshot">
  <div class="smFrame">
    <div class="smUserPhoto">
      <img  src="/system/photos/1/small/8217_667699353137_15600054_38423586_7789442_n.jpg?1316052048" />
    </div>
  </div>
  <div class="findinfo">
    <p><a href="/profiles/1">Name</a></p>
  </div>
</div>

这是在 :photo 为 nil 时呈现的 HTML:

<div class="userSnapshot">
  <div class="smFrame">
    <div class="smUserPhoto">
      <img  src="/photos/small/missing.png" />
    </div>
  </div>
  <div class="findinfo">
    <p><a href="/profiles/2">Name</a></p>
  </div>
</div>

【问题讨论】:

我认为has_attached_file 是模型级别的“声明”?你为什么不直接说image_tag 'images/example.jpg'?我完全误解了上面的代码吗? 是的,我也试过image_tag,但也没有用。显示的照片保存到http://localhost:3000/system/photos/:id/:size/xxxxxx 我不明白。如果头像为 nil,image_tag 应该像任何其他图像一样提供来自/public/images 的图像,并且回形针目录不应该进入等式。 是的,我不太明白。我已经粘贴了上面生成的 HTML。当:photo 以及:photonil 时,您可以看到代码显示的内容。 回形针会不会使照片不为零?很清楚你的 image_tag 什么时候没有渲染。你的has_attached_file 在模型中是什么样子的? rdocs 有帮助吗? 【参考方案1】:

我想你想要exists? 方法。

if @profile.photo.exists?

@profile.photo.nil? 将始终为false,因为它会在丢失时返回默认图像。


注意:这会检查真实文件是否存在,如果您将图像托管在 CDN 上,速度可能会非常慢。

作为一种变通方法,您可以只检查数据库是否认为存在文件:

if @profile.photo_file_name.present?

【讨论】:

【参考方案2】:

查看rdocs 中的:default_url 选项,这就是它按原样呈现的原因。 Paperclip 处理没有附件时的情况。

您可以将默认值设置为不同的值,避免模板中的额外工作。

【讨论】:

酷,谢谢!我之前尝试过 :default_url 但一定没有正确的组合。 太棒了;很高兴你解决了。有时这只是您认为可能有效的随机排列;) 不开玩笑。再次感谢。下一步:元搜索! 如果我不更改 default_url 而只是填写缺少的 png。我应该把它放在文件系统的哪个文件夹下?谢谢 @furiabhavesh,default_url 只是使 uri 与您键入的相同,这里没有资产魔法......所以它只是一个静态公共文件。如果您想使用我认为的资产魔法,您可以执行:default_url =&gt; ActionController::Base.helpers.asset_path(":style/missing.png") 之类的操作。我以前在 rails 3.1 项目中使用过类似的东西,但在 rails 4 中没有。

以上是关于在回形针中指定missing.png的主要内容,如果未能解决你的问题,请参考以下文章

如何在类型提示中指定函数类型?

是否可以在 Count() 中指定条件?

如何在 HTML 的图例中指定不同的形状?

如何在 RSACryptoServiceProvider .NET 类中指定公钥

为啥我们需要在 bindParam() 中指定参数类型?

Postgres:如何在where语句中指定参数[重复]