【问题标题】:Remove rails presenter object assignment from view从视图中删除 rails Presenter 对象分配
【发布时间】:2016-06-24 19:23:12
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 decorator presenter


    【解决方案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
    

    即模型关联的某种“装饰器”,返回演示者而不是模型对象。

    【讨论】:

    • 我用我的演讲者课程更新了我的问题。与使用继承 SimpleDelegator 相比,执行初始化方法是否更可取?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 2011-07-23
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多