有没有更有效/正确的方法在Ruby中编写它?

时间:2012-10-03 20:35:21

标签: ruby-on-rails ruby ruby-on-rails-3

我来自php,刚开始用红宝石和铁轨切割牙齿。

是否有更有效率或更“红宝石”的写作方式?

<% if !@user.twitter_url.empty? %>
    <a class="twitter" href="<%= @user.twitter_url %>">Twitter</a>
<% end %>
<% if !@user.facebook_url.empty? %>
    <a class="facebook" href="<%= @user.facebook_url %>">Facebook</a>
<% end %>
<% if !@user.google_plus_url.empty? %>
    <a class="googleplus" href="<%= @user.google_plus_url %>">Google Plus</a>
<% end %>
<% if !@user.linked_in_url.empty? %>
    <a class="linkedin" href="<%= @user.google_plus_url %>">Linked In</a>
<% end %>

3 个答案:

答案 0 :(得分:10)

最好的方法应该是使用一些Presenter或者一个帮助方法。无论如何使用元编程你可以做到

<% [:twitter, :facebook, :google_plus, :linked_in].each do |social| %>
  <% unless @user.send("#{social}_url").blank? %>
    <a class="<%= social %>" href="<%= @user.send("#{social}_url") %>">social.to_s.titleize </a>
  <% end %>
<% end %>

<% [:twitter, :facebook, :google_plus, :linked_in].each do |social| %>
  <%= link_to(social.to_s.titleize , @user.send("#{social}_url"), class: social) unless @user.send("#{social}_url").blank? %>
<% end %>

甚至:

<% [:twitter, :facebook, :google_plus, :linked_in].each do |social| %>
  <%= link_to_unless @user.send("#{social}_url").blank?, social.to_s.titleize , @user.send("#{social}_url"), class: social %>
<% end %>

答案 1 :(得分:3)

更紧凑的方式:

<%= link_to "Twitter", @user.twitter_url if !@user.twitter_url.blank?  %>
<%= link_to "Facebook", @user.facebook_url if !@user.facebook_url.blank?  %>
<%= link_to "Google Plus", @user.google_plus_url if !@user.google_plus_url.blank?  %>
<%= link_to "Linked In", @user.linked_in_url if !@user.linked_in_url.blank?  %>

代替present?,感谢Mark Thomas的评论:

<%= link_to "Twitter", @user.twitter_url if @user.twitter_url.present?  %>
<%= link_to "Facebook", @user.facebook_url if !@user.facebook_url.present?  %>
<%= link_to "Google Plus", @user.google_plus_url if !@user.google_plus_url.present?  %>
<%= link_to "Linked In", @user.linked_in_url if !@user.linked_in_url.present?  %>

或者您可以使用unless代替if !blank?,但我通常会发现代码使用除非难以阅读,这就是我!

答案 2 :(得分:1)

如果网址字段为零,请使用blank?代替empty?。虽然定义了nil.blank?,但nil.empty?不是。

<% unless @user.twitter_url.blank? %>
    <%= link_to "Twitter", @user.twitter_url, class: "twitter" %>
<% end %>
<% unless @user.facebook_url.blank? %>
    <%= link_to "Facebook", @user.facebook_url, class: "facebook" %>
<% end %>
<% unless @user.google_plus_url.blank? %>
    <%= link_to "Google Plus", @user.google_plus_url, class: "googleplus" %>
<% end %>
<% unless @user.linked_in_url.blank? %>
    <%= link_to "Linked In", @user.linked_in_url, class: "linkedin" %>
<% end %>