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

私はいくつかのリファクタリングをしたいです。だから私は試しました:

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

より良いコードの助けに感謝します。

4

1 に答える 1

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 %>
于 2012-11-07T12:06:04.417 に答える