2012-10-03 47 views
3

我來自php,剛剛開始削減我的紅寶石和鐵軌的牙齒。是否有更有效/正確的方式在Ruby中編寫此代碼?

有沒有更有效率或更「紅寶石」的方式來編寫以下內容?

<% if [email protected]_url.empty? %> 
    <a class="twitter" href="<%= @user.twitter_url %>">Twitter</a> 
<% end %> 
<% if [email protected]_url.empty? %> 
    <a class="facebook" href="<%= @user.facebook_url %>">Facebook</a> 
<% end %> 
<% if [email protected]_plus_url.empty? %> 
    <a class="googleplus" href="<%= @user.google_plus_url %>">Google Plus</a> 
<% end %> 
<% if [email protected]_in_url.empty? %> 
    <a class="linkedin" href="<%= @user.google_plus_url %>">Linked In</a> 
<% end %> 

回答

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

使用blank?,而不是empty?在這裏情況下,URL字段是零。雖然定義了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 %> 
3

更緊湊的方式:

<%= link_to "Twitter", @user.twitter_url if [email protected]_url.blank? %> 
<%= link_to "Facebook", @user.facebook_url if [email protected]_url.blank? %> 
<%= link_to "Google Plus", @user.google_plus_url if [email protected]_plus_url.blank? %> 
<%= link_to "Linked In", @user.linked_in_url if [email protected]_in_url.blank? %> 

隨着present?代替,這要歸功於馬克托馬斯評論:

<%= link_to "Twitter", @user.twitter_url if @user.twitter_url.present? %> 
<%= link_to "Facebook", @user.facebook_url if [email protected]_url.present? %> 
<%= link_to "Google Plus", @user.google_plus_url if [email protected]_plus_url.present? %> 
<%= link_to "Linked In", @user.linked_in_url if [email protected]_in_url.present? %> 

或者你可以使用unless代替if !blank?,但總的來說,我發現代碼使用,除非難以閱讀,這只是我!

+1

+1除了我,如果@ user.twitter_url.present使用''而不是否定'空白?' –

+0

正確,忘記了存在?在Rails中! –

+0

爲什麼存在?更好?查看http://api.rubyonrails.org/classes/Object.html#method-i-present-3F並顯示源代碼)是否與空白不一樣?如果它一樣,會不會使用本地空白?要更快?還是我誤解了一些東西(我是紅寶石/ rails noob之後) – JonathanW

相關問題