Rails - Paperclip - 设置随机更改默认图像

时间:2014-01-21 17:35:44

标签: ruby-on-rails ruby ruby-on-rails-3 image paperclip

我在Rails 3.2应用程序中使用Paperclip进行图像上传。 目标是在用户每次上传自己的图片之前,每次创建新帖子时显示不同的(随机更改的)默认图片。

我在这里发现了thisthis个问题,但遗憾的是这些解决方案对我不起作用。

这是 post.rb模型

has_attached_file :image, styles: { medium: "320x240>"}
validates_attachment :image, 
content_type: { content_type: ['image/jpeg', 'image/jpg', 'image/png'] }, 
size: { less_than: 2.megabytes }

belongs_to :user
has_attached_file :image, styles: { thumb: "100x100", small: "160x120", medium: "320x240>", large: "640x480", fullscreen: "1000x300#" },
:default_url => '/assets/1.jpg'

而不是:default_url => '/assets/1.jpg'我想设置一些随机显示十个图像中的一个(1.jpg到10.jpg)。

如果我尝试使用:default_url => lambda {'/assets/#{rand(5)}.jpg'},我会收到此错误消息: 帖子中的ArgumentError #new - 错误的参数个数(1表示0)

1 个答案:

答案 0 :(得分:2)

问题是要做你想做的事,paperclip必须支持default_url中的lambdas 考虑到我认为它没有(但我不确定,我很久以前就读过它),我建议你采取“简单的路线”,即使它感觉不太正确(但不是那么多)。有了视图和助手,可以这样做:

<强> post_helper.rb

module PostHelper

  def post_image_url(post)
    return post.image.url if post.image.exists?

    number_between_0_and_3 = rand(4)

    "my_random_image_#{ number_between_0_and_3 }.jpg"
  end

end

<强> my_view.html.erb

<%= image_tag(post_image_url(@post), alt: 'Dunno') %>

如果你的app / assets / images中有这4个文件:

  • my_random_image_0.jpg
  • my_random_image_1.jpg
  • my_random_image_2.jpg
  • my_random_image_3.jpg

每次都会随机选择其中一个。

重要提示:我没有测试代码,所以你可能会发现一些小错误但是这个想法,如果你认为它是伪代码,那就没关系。无论如何,我很确定它会起作用。

重要提示2:这会更改用户图片每次您访问该页面。

如果你想为页面上的用户创建一个永久性的随机图像,你可能想要采用这种方法:基于用户ID(或多或少是“随机”),你可以简单地用你的帮助替换你的帮助这样:

<强> post_helper.rb

module PostHelper

  def post_image_url(post)
    return post.image.url if post.image.exists?

    # Here is the change, you must ensure post.user is always present anyway!
    number_between_0_and_3 = post.user.id % 4

    "my_random_image_#{ number_between_0_and_3 }.jpg"
  end

end

这将根据id授予用户my_random_image_0.jpg和my_random_image_3.jpg之间的随机图像,因此它不会在页面之间发生变化,但它仍然是伪随机的。

此外,您还有一个优势,即如果用户检查他的个人资料,头像图像将显示为空,而不是在那里显示图像(因此用户知道他必须添加头像,更好的用户体验)。