2012-11-07 6 views
0

다음 도우미 메서드를 만들고 잘 작동하지만 호출되는 방식을 개선하고 싶습니다. 이 코드를 어떻게 리팩토링 할 수 있습니까?

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

. 그래서 시도 : 나는 코드의 더 나은 부분에 대한 몇 가지 도움을 주셔서 감사합니다

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> 

:

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

위의 코드 블록은 오류를 반환했습니다.

답변

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

관련 문제