2013-09-05 205 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