π€ Situation
I have a STI model named Media which has two chirdren models which are Photo and Video. And I've wanted to not change the view logic by each class.
Example
<% @album.media.each do |medium| %>
  <div>
    <%= file_content(medium) %>
  </div>
<% end %>
π But I didn't want to write like this.
If I ask object about class and then switch the logic, it's not OOP anymore. I have to write again when I add a new class like 'text', 'sound'.
module MediaHelper
  def file_content(medium)
    return nil unless medium.file.attached?
    if medium.class == Photo
      return photo_content(medium)
    else
      return video_content(medium)
    end
  end
end
π How have I solved it?
I wrote the helper like this.
module MediaHelper
  def file_content(medium)
    return nil unless medium.file.attached?
    send("#{medium.class.name.underscore}_content", medium)
  end
end
module PhotosHelper
  def photo_content(medium)
    # do something
  end
end
module VideosHelper
  def video_content(medium)
    # do something
  end
end
π¦ But, I believe there is a better way.
I don't know it works. But I hope I will change my code like this.
1. remove the parent helper
# module MediaHelper
#   def file_content(medium)
#     return nil unless medium.file.attached?
#     send("#{medium.class.name.underscore}_content", medium)
#   end
# end
2. align the children's helper names.
module PhotosHelper
  def file_content(medium)
    # do something
  end
end
module VideosHelper
  def file_content(medium)
    # do something
  end
end
 

 
    
Top comments (0)