2

我无法理解如何使用 Sinatra 与 MVC 一起实现 Presenter 模式。

我已经阅读了很多帖子,但没有一个真正专注于我感兴趣的特定用例。

为了清楚起见,我已经在使用“Sinatra Up and Running”中定义的 MVC 模式(请参阅:https ://github.com/Integralist/sinatra-mvc/ -> 自从我最初创建这个 repo 以来,我的代码已经改变但它会让您了解我正在使用的 MVC 结构)。

我想要达到的目标......

我对 Presenter 的理解是整理 Model 数据,然后将其传递给 View。然后将其传递回控制器,然后控制器再渲染视图。

我想使用 Presenter 模式的原因不仅是为了保持控制器的清洁,而且还能够组成一个由“组件”(HTML 块)组成的页面,这样我就可以在不同的页面上重用一些组件。

如何实施?

但我不确定如何实现这一点。有人可以告诉我一个如何做到这一点的例子(如果编写一个真实的例子需要很多工作,伪代码就可以了)?

这是我设想的一些示例代码,我不确定我的想法是否正确或实现将如何工作(我尝试了不同的方法,但由于我对如何理解缺乏了解而遇到了问题Sinatra 在幕后工作)...

class ContactController < ApplicationController
    get '/' do
        @component_a = require './presenter/a'
        @component_b = require './presenter/b'
        erb :contact
    end
end

...我假设我的视图中仍然需要一些基本逻辑来确定页面中加载组件的位置,例如...

<%
    if @component_a
        erb :"#{@component_a}"
    end
%>

所以这让我认为加载演示者可能应该返回一些允许这种情况发生的东西。

任何关于如何更好地做到这一点的建议也非常受欢迎。

谢谢!

4

2 回答 2

0

我设法让这个工作。在此处查看我的代码库:https ://github.com/Integralist/MVCP

于 2013-10-21T08:59:58.250 回答
0

我真的不知道 Presenter 模式(知道:) 只是当我觉得我没有足够的模式可以记住时偶尔阅读的内容......但这里有一些我知道的用于从部分组成页面的选项:

西纳特拉部分

您可能想看看Sinatra Partial(披露:我是维护者),因为它可以很容易地将视图放入视图中或放入路径中的变量中,例如

require "sinatra/partial"
class ContactController < ApplicationController
  register Sinatra::Partial

  set :partial_template_engine, :erb

  get '/' do
    # do some stuff here, fill some models etc
    # then…
    # will render the template in views/presenter/a.erb
    @component_a = partial :"presenter/a"
    # will render the views/presenter/b.erb
    @component_b = partial :"presenter/b"
    erb :contact
  end
end

尽管我可能只是将这些调用partial放在视图中:

# contact.erb
<%= partial :"presenter/a" if @mymodel.is_full %>
<%= partial :"presenter/b" %>

用你想要的任何逻辑。

胡子

Mustache值得一看,我不将它与 Ruby 或 Sinatra 一起使用,但它似乎是一个现成的 Presenter 模式。它甚至有 Sinatra 集成和示例。

Sinatra::ContentFor

https://rubygems.org/gems/sinatra-contrib

我从来没有使用过它,我只知道它存在并且做一些类似于 Sinatra Partial 的事情。

这是一篇关于使用Forwardable构建 Presenter的好文章(尽管它是针对 Rails 和 2007 年的) 。然后你可以将它作为一个对象传递给contact.erb模板,但你仍然需要在模板或演示者中放置一些逻辑来处理存在哪些字段。

于 2013-10-19T02:29:34.697 回答