2012-11-07 98 views
0

我創建了下面的幫助器方法,它工作正常,但我想改進它被調用的方式。我該如何重構Ruby的這段代碼?

def display_if_present(attribute, i18key, hours=nil) 
    unless attribute.blank? 
    content_tag :li do 

     if hours.present? 
     concat content_tag :h2, get_translation_by_model_attr('achievment', i18key) + ' ('+t(:hours)+'): ' 
     else 
     concat content_tag :h2, get_translation_by_model_attr('achievment', i18key)+': ' 
     end 

     if i18key.include? 'date' 
     concat content_tag :p, attribute.strftime('%m/%Y') 
     elsif hours.present? 
     concat content_tag :p, h(attribute) + "(" + t(:hours) + ")" 
     else 
     concat content_tag :p, h(attribute) 
     end 
    end 
    end 
end 

而且在view側我有以下幾點:

<%= display_if_present(academic_achievment.institution,'institution') %> 

<%= display_if_present(academic_achievment.ativs_description,'ativs_description') %> 

<%= display_if_present(academic_achievment.date_start,'date_start') %> 

<%= display_if_present(academic_achievment.date_finished,'date_finished') %> 

<%= display_if_present(academic_achievment.load, 'load', :hours) %> 

<%= display_if_present(academic_achievment.tags, 'tags') %> 

這是我想要做一些重構。所以,我想:

<% elements = %w(institution ativs_description date_start date_finished load tags) %> 

<% elements.collect! do |item| %> 
    <% params = (item == "load") ? "item, :hours" : "item" %> 
    <%= display_if_present("academic_achievment.#{item}".constantize, params.constantize) %> 
<% end %> 

上面的代碼塊返回的錯誤:

wrong constant name academic_achievment.institution 
Extracted source (around line #15): 

12: 
13:   <% elements.collect! do |item| %> 
14:   <% params = (item == "load") ? "item, :hours" : "item" %> 
15:   <%= display_if_present("academic_achievment.#{item}".constantize, params.constantize) %> 
16:   <% end %> 
17: 
18:  </ul> 

我很欣賞一個更好的代碼一些幫助。

回答

1

我建議使用send方法是這樣的:

<% %w(institution ativs_description date_start date_finished load tags).each do |item| %> 
    <%= display_if_present(academic_achievment.send(item), item, item == 'load' ? :hours : nil) %> 
<% end %> 
+0

謝謝!這樣可行! :) –

+0

不客氣:-) – Mischa