【问题标题】:Rails - Paperclip - Set Randomly Changing Default ImagesRails - 回形针 - 设置随机更改的默认图像
【发布时间】:2014-02-11 11:11:51
【问题描述】:

我在 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'

我想设置一些随机显示十张图片(1.jpg 到 10.jpg)之一的东西,而不是 :default_url => '/assets/1.jpg'

如果我尝试使用:default_url => lambda {'/assets/#{rand(5)}.jpg'},我会收到以下错误: Posts#new 中的 ArgumentError - 参数数量错误(1 代表 0)

【问题讨论】:

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


    【解决方案1】:

    问题在于,要执行您想要的操作,回形针必须支持 default_url 中的 lambda。
    考虑到我认为它不是(但我不确定,我很久以前读过一些关于它的东西),我建议你采取“简单的路线”,即使它感觉不太正确(但不是那么多)。使用视图和助手,执行以下操作:

    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 之间的随机图像,因此它不会跨页面更改,但仍将是伪随机的。

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

    【讨论】:

    • 非常感谢您的快速回复!您对“view.html.erb”提出了建议 - 但是我应该在 post.rb 模型中而不是 :default_url => '/assets/1.jpg' 中写什么?我可以删除它吗?
    • @YvonC:你可以两者都做,我建议你总是有一个默认的 url,所以保留它,即使你根本不使用它。另请参阅我的编辑,其中有一些改进
    • 感谢@Fire-Dragon-DoL;这个解决方案是完美的。对其他人来说,如果您使用不同的图像尺寸,只需在辅助方法中添加另一个参数:image_tag(post_image_url(post, 'medium'))。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多