【问题标题】:Ruby on Rails: Displaying images at randomRuby on Rails:随机显示图像
【发布时间】:2013-09-09 15:38:01
【问题描述】:

我正在尝试根据与“价格”相关的 if/else 语句显示一张图片。我的 /assets/images 目录中有 5 个文件夹,如下所示:

very_bad
bad
ok
good
very_good

每个文件夹包含多张图片,我想随机从相应文件夹中抓取一张图片,因此用户不必总是看到同一张图片。

例如,如果价格低于 -2%,我想随机显示“very_bad”文件夹中的图像。如果价格大于 2%,我想随机显示“very_good”文件夹中的图像。

您将如何解决这个问题?感谢您的帮助!

【问题讨论】:

    标签: ruby-on-rails image conditional-statements


    【解决方案1】:

    确定文件夹名称后(我们以very_good 为例),根据您拥有的图像数量确定一个随机数。假设您在每个文件夹中有四个图像,使用rand(4) 在[0,1,2,3] 中获取一个随机数。在每个文件夹中将您的图像命名为 0.png、1.png 等。现在您应该能够随机显示其中一张图像,给定文件夹名称,如下所示:

    <%= image_tag "very_good/#{rand(4)}.png" %>
    

    由于您的文件夹名称可能是动态的,它看起来更像这样:

    <%= image_tag "#{@folder_name}/#{rand(4)}.png" %>
    

    【讨论】:

    • 这很好,但它没有考虑到其他文件格式,在某些情况下,由于格式更改而导致质量下降。
    • Rails 的最新版本不需要您指定扩展名,因此这是一个选项。但我也会在下面查看@bevanb 的答案。我不确定在这样的操作中从文件系统读取的性能后果,但如果这就是格式更改的意思,你肯定不会遇到扩展问题。
    • 此解决方案要求您重命名文件,并且不考虑.png以外的任何图像文件格式。如果图像文件名(及其生成的 alt 标签)很重要,即对于 SEO 或可访问性,这不是一个可行的选择。
    • @Tina 是的,根据我之前的评论,如果您不介意访问文件系统,bevanb 在下面有一个更强大的解决方案。命名/格式需要保存在某个地方,因此您需要决定是要从文件系统、其他一些持久层中读取,还是像我上面建议的那样对其进行硬编码。视情况而定。
    【解决方案2】:

    这是一个无需重命名图像的解决方案。

    一旦您知道您的文件夹,执行此操作以在该文件夹中随机选择一张图片:

    =image_tag Dir.new(Rails.root.to_s + "/app/assets/images/my-folder").to_a.select{|f|    f.downcase.match(/\.jpg|\.jpeg|\.png/) }.sample
    

    【讨论】:

      【解决方案3】:

      您可以使用Dir.glob、数组.sample 和.split 方法轻松完成此操作。

      假设我的 Rails 图像资产文件夹中名为 ./backgrounds 的文件夹中有所有随机图像:

      app/assets/images/
      └── backgrounds
          ├── beach.jpeg
          ├── bright-flowers-pink-skies.jpeg        
          ├── fall-autumn-red-season.jpg
          └── fjord.jpeg
      

      我可以在./app/helpers/application_helpers.rb 中创建一个助手——或者你想放置助手的任何地方——它具有以下代码:

      module ApplicationHelper
        def get_random_image
          image_path_prefix = "app/assets/images/"
          image_files = Dir.glob("#{image_path_prefix}backgrounds/*")
          image_files.sample.split(image_path_prefix)[1]
        end
      end
      

      它的作用是遍历./app/assets/images/backgrounds 中的所有路径,返回一个随机路径(使用.sample),通过拆分字符串删除图像路径前缀,并返回它的结尾部分。

      然后在您的 ERB 模板中,您可以像这样显示图像:

      <%= image_tag get_random_image %>
      

      这应该会生成一个随机图像的图像标签。请注意前导和尾随斜杠。

      【讨论】:

      • 感谢@Tina,这应该被标记为正确答案
      【解决方案4】:

      这是蒂娜和贝文的答案组合

      module ImageHelper
        def random_image(folder)
          image_path_prefix = "app/assets/images/"
          image_files = Dir.new("#{image_path_prefix}#{folder}")
                           .to_a.select { |f| f.downcase.match(/\.jpg|\.jpeg|\.png/) }
          image = image_files.sample
          "#{folder}/#{image}"
        end
      end
      

      这样使用

      <%= asset_path(random_image('good/really_good')) %>
      

      【讨论】:

        猜你喜欢
        • 2012-11-24
        • 1970-01-01
        • 2014-09-02
        • 1970-01-01
        • 2017-10-10
        • 2013-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多