imaz
2015/12/07 21:10:39 投稿
1

"【Refactor Me】viewに条件式" のviewから条件式を排除した

Railsアプリを想定してリファクタリングしました。

ポイント

  • DOMの組み立てをモデルからActiveDecoratorに移動した

Before

# view
<% if current_user.admin? %>
  <%= current_user.message_for_admin(@message) %>
<% else %>
  <%= current_user.message_for_general(@message) %>
<% end %>

# app/models/user.rb
def message_for_admin message
  img_tag = '<img src="/assets/message/admin.png" />'
  span_tag = "<span>#{message.body}</span>"
  "<div>#{img_tag}#{span_tag}</div>"
end

def messsage_for_general message
  img_tag = '<img src="/assets/message/general.png" />'
  span_tag = "<span>#{message.body}</span>"
  "<div>#{img_tag}#{span_tag}</div>"
end

After

# mv app/assets/{,images/}message/admin.png
# mv app/assets/{,images/}message/general.png

# view
<%= @message.with_role_image(current_user) %>

# app/models/user.rb
class User < ActiveRecord::Base
  def role
    admin? ? 'admin' : 'general'
  end 
end

# app/decorators/user_decorator.rb
module UserDecorator
  def role_image
    image_tag("message/#{role}.png")
  end 
end

# app/decorators/message_decorator.rb
module MessageDecorator
  def with_role_image(user)
    content_tag(:div, user.role_image + content_tag(:span, message.body))
  end 
end

みんなのコメント