2016-04-02 59 views
2

我試圖檢查用戶的總和鏈接是否是img。如果是我想將它放在一個img標籤中。這是我第一次在rails上使用Ruby,或者一般的Ruby。什麼應該考慮這個IF循環的最佳實踐?

<% if link.url.include? ".jpg" %> 
    <div class="img_wrapper"><img src="<%= link.url %>"></img></div> 
<% elsif link.url.include? ".png" %> 
    <div class="img_wrapper"><img src="<%= link.url %>"></img></div> 
<% elsif link.url.include? ".gif" %> 
    <div class="img_wrapper"><img src="<%= link.url %>"></img></div> 
<% else %> 
    <div class="img_wrapper"><img src="../assets/no_image.png"></img></div> 
<% end %> 
+0

如果使用回形針,請查看'default_url'選項。當沒有人提供時,應清理視圖並回退到默認圖像。 –

回答

2

我覺得這樣的邏輯屬於納入模型,因爲這使得它更容易測試和重用:

# in app/models/link.rb 
def image? 
    %w(.gif .jpg .png).include?(File.extname(url)) 
end 

# in the view 
<% if link.image? %> 
    <div class="img_wrapper"><img src="<%= link.url %>"></img></div> 
<% else %> 
    <div class="img_wrapper"><img src="../assets/no_image.png"></img></div> 
<% end %> 

或甚至更短(您可能想要擴展文件擴展名列表(例如bmp,jpegtiff)):

# in app/models/link.rb 
def image_url 
    %w(.gif .jpg .png).include?(File.extname(url)) ? url : 'no_image.png' 
end 

# in the view 
<div class="img_wrapper"><%= image_tag(link.image_url) %></div> 

image_tag版本將使用asset pipeline

1
<% img_src = %w(.jpg .png .gif).any? {|e| link.url.include?(e)} ? link.url : "../assets/no_image.png"%> 
<div class="img_wrapper"><img src= <%= img_src %> ></img></div> 
+0

'%w(...)'構造在空白處分裂。你不要在那裏逗號。 –

1

由於大多數的情況都是一樣的,你可以把它降低到一個單一的條件:

<% if [".jpg", ".png", ".gif"].any? { |ext| link.url.ends_with?(ext) %> 
    <div class="img_wrapper"><img src="<%= link.url %>"></img></div> 
<% else %> 
    <div class="img_wrapper"><img src="../assets/no_image.png"></img></div> 
<% end %> 

注意我使用字符串#ENDS_WITH?從ActiveSupport這裏,這是默認包含在Rails中。

這很可能是更有效地做正則表達式的延伸檢查,雖然:

<% if link.url =~ /.+(\.gif|\.jpg|\.png)$/ %> 
    <div class="img_wrapper"><img src="<%= link.url %>"></img></div> 
<% else %> 
    <div class="img_wrapper"><img src="../assets/no_image.png"></img></div> 
<% end %> 

要解釋的正則表達式:

  • 整個事情被包裹在//,它定義了它作爲正則表達式
  • .+匹配任意數量的字符
  • (\.gif|\.jpg|\.png)匹配任何擴展名。
  • $匹配字符串的末尾。

所以,用簡單的英語:匹配一個字符串,如果它有任意數量的字符後跟一個匹配的擴展,然後是字符串的末尾。

你可以重構它到2線,如果你想要的是:

<% image_url = link.url =~ /.+(\.gif|\.jpg|\.png)$/ ? link.url : "../assets/no_image.png" %> 
    <div class="img_wrapper"><img src="<%= image_url %>"></img></div> 
+0

@llya對不起,錯字,其'任何?' –

+0

首先非常感謝您的時間。只是想知道是正則表達式內置? – Cylion

+0

@ J.Perrone是的,它被構建到Ruby中。我建議[Rubular.com](http://rubular.com)幫助學習它。 –