冒险村22 - Design Pattern(2) - Presenter

22 - Design Pattern(2) - Presenter

Presenter pattern 的原理是,是 Model-View-Controller(MVC) 架构模式衍生出来的一个部分,主要用於建立使用者的介面接口。 在 MVP 中,Presenter 承担了 中间人 的功能。在 MVP 中,所有逻辑的部份都会写在 Presenter 内。事实上,其实与 Decorator 有点相似,通常有些些微的差异,但通常只会选择两个其中一个来整理,也没有一定的通则,主要还是以团队内的方式为主。

直接来看如何使用:

假设我有一张 Log 的表,里面 operator 栏位纪录了 User 谁操作了某项东西,所以纪录这个 Log,并且知道 Source -> Target 从 A 到 B,这时候想要後台的前端可以看到 Log 纪录,随便举个例子。

Create app/presenters folder

  • user_log_presenter.rb

Add Presenter to Controller

假设 Log 是在 TrackController 内的 show 来显示,范例如下:

  # frozen_string_literal: true
  class TrackingController < ApplicationController
    def show
      @user_logs = UserLogPresenter.new(user_id)
    end

    # ...
  end

Add app > presenters > user_log_presenter.rb

Enumerable include 近来提供 each 等等方法,

  # frozen_string_literal: true
  class UserLogPresenter
  include Enumerable

    def initialize(user_id)
      @user_id = user_id
    end

    def each(&_block)
      logs.each do |log|
        yield format(log)
      end
    end

    def format(log)
      {
        user:       User.find(log.operator),
        source:     log.source,
        target:     log.target,
        created_at: log.created_at
      }
    end

    def logs
      @logs ||= Log.where(operator: user_id)
    end
  end

View

  @user_logs.each do |log|
    <th><%= log[:user] %></th>
    <th><%= log[:source] %></th>
    <th><%= log[:target] %></th>
    <th><%= log[:created_at] %></th>
  end

注: 想理解两者的差异也可以参考这篇的比较 Ruby on Rails patterns - decorator vs presenter,虽然目前我也没有可以完全的分懂 orz

参考资料

My blog


<<:  Day30-"总复习"

>>:  [day22]Vue实作-交易建立页面

Firebase来帮忙资料上传 Day 12

将资料上传至Firebase上 使用UIImagePikerController来选取照片上传 使用...

[重构倒数第19天] - i18n什麽的交给前端来处理吧(二) Vue3 载入Vue-i18n

前言 该系列是为了让看过Vue官方文件或学过Vue但是却不知道怎麽下手去重构现在有的网站而去规画的系...

[Angular] Day22. Common Routing Tasks(二)

在上一篇中介绍了如何透过 router 传递参数,也介绍了怎麽建立嵌套的 route 等等,在本篇中...

【DAY 6】沟通 0 距离 - Micorsoft Teams 的应用技巧

哈罗 ~ 大家好 ~ 欢迎回来 ~ 昨天提到 Power Automate 的自动化流程以及核准流程...

[Day22] Esp32用STA mode + AHT10 - (程序码讲解)

1.前言 这边主要是为解说前几篇关於AHT10的程序码,此次主要讲的部分是loop中的程序码,因为透...