2013-09-05 148 views
3

我试图根据与“price”相关的if/else语句显示一个图像。我在我的/资产/ images目录5个文件夹,如下所示:Ruby on Rails:随机显示图像

very_bad 
bad 
ok 
good 
very_good 

每个文件夹包含多张图片,我想从随机相应的文件夹抢只有一个形象,所以用户并不总是有看到相同的图像。

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

你会如何解决这个问题?谢谢您的帮助!

回答

7

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

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

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

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

太棒了...谢谢!!! –

+0

这是相当不错的,但它没有考虑到其他文件格式,在某些情况下,由于格式改变,质量会丢失。 – Vantalk

+0

最近的rails版本不需要你指定扩展名,所以这是一个选项。但是我也会在下面看看@ bevanb的答案。我不确定在这样的操作中从文件系统中读取性能的后果,但如果这是您的格式更改意味着您肯定不会遇到扩展问题。 – hiattp

7

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

一旦你知道你的文件夹,这样做随机选择该文件夹内的图片:

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

您可以使用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创建一个帮手 - 或者任何你想放helper-具有以下代码:

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 %> 

这将导致图像标签用于生成一个随机的图像。注意要注意引导和尾随的斜杠。

+0

谢谢你@Tina,这应该被标记为正确答案 – Slowboy