Удалить назначение объекта rails Presenter из поля зрения

Я использую объект Presenter с пространством имен, чтобы помочь реорганизовать некоторую логику представления представления для атрибутов моей модели.

Для одного объекта, отправляемого с контроллера, я бы сделал

@user = Users::UserPresenter.new(@user)

и это работает нормально. Для запроса пользователей я создал метод .present(), который сопоставляет и применяет UserPresenter.new к каждому пользователю, поэтому я делаю

@users = Users::UserPresenter.present(users)

и это работает нормально. Но как насчет того, когда я передаю объект, который затем повторяет отношения в представлении. Простым примером будет

  <% appointment.users.each do |user| %>
    <% user = Users::UserPresenter.new(user) %>
    <li> <%= user.age%></li>
  <% end %>

Более сложным примером может быть

  <% appointment.appointment_host.family.users.each do |user| %>
    <% user = Users::UserPresenter.new(user) %>
    <li> <%= user.age%></li>
  <% end %>

user_presenter.rb

module Users
  class UserPresenter < SimpleDelegator 
     # methods
  end
end

Мне не нравится устанавливать объект Presenter в представлении. Как лучше справиться с этим? В идеале использовать те же шаблоны, что и у меня до сих пор.


person MicFin    schedule 10.03.2016    source источник


Ответы (1)


Возможно, вы могли бы создать иерархию презентаторов, аналогичную ассоциациям моделей, а затем передать в представление только корневые презентаторы. Что-то вроде этого:

class AppointmentPresenter
  def initialize(appointment)
    @appointment = appointment
  end

  def users
    Users::UserPresenter.present(@appointment.users)
  end

  def host_family_users
    Users::UserPresenter.present(@appointment.appointment_host.family.users)
  end

  # or perhaps even indeed create a presenter for each collection:
  def appointment_host
    AppointmentHostPresenter.new(@appointment.appointment_host)
    # this presenter would have the `family` method returning a FamilyPresenter, etc.
  end
end

т.е. своего рода «декораторы» для ассоциаций модели, возвращающие презентеры вместо объектов модели.

person BoraMa    schedule 10.03.2016
comment
я обновил свой вопрос с моим классом ведущего. Предпочтительнее ли использовать метод инициализации по сравнению с использованием наследования SimpleDelegator? - person MicFin; 14.03.2016