从视图中删除 rails 演示者对象分配

Remove rails presenter object assignment from view

我正在使用带命名空间的 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 对象。有什么更好的方法来处理这个问题?理想情况下使用与我迄今为止类似的模式。

也许您可以创建类似于模型关联的演示者层次结构,然后仅将根演示者传递给视图。像这样:

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

即模型关联的某种 "decorators",返回演示者而不是模型对象。