我很难理解如何使用sinatra实现mvc旁边的presenter模式。
我读过很多文章,但没有一篇真正关注我感兴趣的特定用例。
为了清楚起见,我已经在使用“Sinatra启动并运行”中定义的MVC模式(请参见:https://github.com/Integralist/sinatra-mvc/->我的代码自最初创建此repo以来已经更改,但它会让您了解我正在使用的MVC结构)。
我想达到的…
我对演示者的理解是整理模型数据,然后将其传递到视图。然后将其传递回控制器,然后由该控制器呈现视图。
我想使用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
%>

所以这让我认为加载一个演示者可能会返回一些允许这种情况发生的东西。
任何关于如何做得更好的建议也是非常受欢迎的。
谢谢!

最佳答案

我真的不知道演示者模式(我知道:)只有当我觉得我没有足够的模式来支撑我的头脑时,我偶尔读到的内容……但我知道以下是一些从部分组成页面的选项:
西纳屈部分
您可能需要查看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

尽管我可能只是把这些调用放到视图中:
# contact.erb
<%= partial :"presenter/a" if @mymodel.is_full %>
<%= partial :"presenter/b" %>

不管你想要什么逻辑。
胡子
Mustache值得一看,我没有将它与ruby或sinatra一起使用,但它似乎是一个现成的演示模式。它甚至有Sinatra集成和例子。
Sinatra::内容
https://rubygems.org/gems/sinatra-contrib
我从来没有使用过它,我只知道它存在,并且做一些类似于西纳特拉的事情。
This is a good (even though it's for Rails and from 2007) article使用partial构建演示者然后,您可以将它作为一个对象传递给Forwardable模板,但是您仍然需要在模板或演示者中放置一些逻辑来处理哪些字段存在。

关于ruby - 使用Ruby的Sinatra的演示者的示例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19337704/

10-14 01:38