从视图中删除 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",返回演示者而不是模型对象。
我正在使用带命名空间的 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",返回演示者而不是模型对象。