2016-04-02 13 views
2

私は、ユーザからのsumitedリンクがimgかどうかをチェックしようとしています。それが1つのimgタグに入れたいと思っています。 Ruby on Railsや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

Paperclipを使用している場合は、 '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 %> 

あるいは短い(あなたはファイル拡張子(EQ bmpjpegまたはtiff)のリストを消費する場合があります):

# 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

条件のほとんどが同じなので、あなたは、単一の条件にそれを減らすことができます:私は、文字列#のends_withを使用してい

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

注意?ここの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申し訳ありませんタイプミス、その 'any? ' –

+0

まずはお時間をいただきありがとうございます。 Regexが組み込まれているのだろうか? – Cylion

+0

@ J.Perroneええ、それはRubyに組み込まれています。私はそれを学ぶのを助けるために[Rubular.com](http://rubular.com)を勧めます。 –

関連する問題