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>
我很欣賞一個更好的代碼一些幫助。
謝謝!這樣可行! :) –
不客氣:-) – Mischa