Я часто видел, как шаблон 1 наиболее часто использовался для докладчиков Rails.
1) Зачем докладчику нужен контекст представления?
2) Между шаблоном 1 и 2 шаблон 2 кажется более простым, поскольку вам не нужно заключать весь код в блок.Почему это не используется чаще?Есть ли недостаток в использовании этого?против шаблона 1?
3) С шаблоном 3, почему люди вообще не используют этот шаблон?
Presenter
module ApplicationHelper
def present(model, presenter_class=nil)
klass = presenter_class || "#{model.class}Presenter".constantize
presenter = klass.new(model, self)
yield(presenter) if block_given?
end
end
class UserPresenter < ApplicationPresenter
def full_name
"#{@model.first_name} #{@model.last_name}"
end
def birth_year
return nil unless @model.birthdate
@model.birthdate.year
end
def nickel_per_year
return nil unless @model.birthdate
difference = Date.today.year - birth_year
@view.number_to_currency(difference * 0.05)
end
end
class ApplicationPresenter < SimpleDelegator
def initialize(model, view)
@model, @view = model, view
super(@model)
end
end
Pattern 1
Использование помощника докладчика в виде с блоком
View
<% @users.each do |u| %>
<% present(u) do |user| %>
<tr>
<td><%= user.full_name %></td>
<td><%= user.email %></td>
<td><%= user.birthdate %></td>
<td><%= user.birth_year %></td>
<td><%= user.nickel_per_year %></td>
<td><%= link_to 'Show', user %></td>
<td><%= link_to 'Edit', edit_user_path(user) %></td>
<td><%= link_to 'Destroy', user, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
<% end %>
Шаблон 2
Использование презентера в виде и переменная установки
Вид
<% @users.each do |u| %>
<% user = UserPresenter.new(user, self) %>
<tr>
<td><%= user.full_name %></td>
<td><%= user.email %></td>
<td><%= user.birthdate %></td>
<td><%= user.birth_year %></td>
<td><%= user.nickel_per_year %></td>
<td><%= link_to 'Show', user %></td>
<td><%= link_to 'Edit', edit_user_path(user) %></td>
<td><%= link_to 'Destroy', user, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
Шаблон 3
Использование презентатора в контроллере, при условии, что вы можете передать контекст представления в таком решении.https://github.com/endofunky/oprah
UserController
def show
@user = UserPresenter.new(User.find(params[:id]), view_context)
end
def index
@users = Users.all.map {|user| UserPresenter.new(user, view_context) }
end