什么应该被认为是这个IF循环的最佳实践?

时间:2016-04-02 21:10:20

标签: ruby-on-rails ruby

我正在尝试检查用户的总和链接是否为img。如果是的话我想把它放在一个img标签中。这是我第一次使用Ruby on rails或Ruby。

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

3 个答案:

答案 0 :(得分: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 %>

甚至更短(您可能希望花费文件扩展名列表(例如bmpjpegtiff)):

# 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 :(得分: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>

答案 2 :(得分: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 %>

注意我正在使用String#ends_with?来自ActiveSupport,默认情况下包含在Rails中。

使用Regex进行扩展检查可能更有效:

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