我在Rails 3.2应用程序中使用Paperclip进行图像上传。 目标是在用户每次上传自己的图片之前,每次创建新帖子时显示不同的(随机更改的)默认图片。
我在这里发现了this和this个问题,但遗憾的是这些解决方案对我不起作用。
这是 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)
答案 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个文件:
每次都会随机选择其中一个。
重要提示:我没有测试代码,所以你可能会发现一些小错误但是这个想法,如果你认为它是伪代码,那就没关系。无论如何,我很确定它会起作用。
重要提示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之间的随机图像,因此它不会在页面之间发生变化,但它仍然是伪随机的。
此外,您还有一个优势,即如果用户检查他的个人资料,头像图像将显示为空,而不是在那里显示图像(因此用户知道他必须添加头像,更好的用户体验)。