Dynamically extended helper module in presenter class
Posted Almost 7 years ago. Visible to the public. Draft.
# models/movie.rb
class Movie
include ActiveModel::Model
attr_accessor :id, :title, :genres, :date, :rating
end
# presenters/movies_presenter.rb
require 'erb'
class MoviesPresenter
def initialize(movies, display_formatter: nil)
@movies = movies
@display_formatter = display_formatter || Object.new.extend(MoviesHelper)
end
def render
ERB.new(<<~'HTML').result(binding).html_safe
<ul>
<% @movies.each do |m| %>
<li><%= @display_formatter.short_display_name(m) %></li>
<% end %>
</ul>
HTML
end
end
# helpers/movies_helper.rb
module MoviesHelper
def short_display_name(movie)
<<~HTML.html_safe
<b>#{movie.title}</b>, #{movie.date.strftime('%v')}. <u>Rating: <i>#{movie.rating}</i></u>
HTML
end
end