ruby - 使用 Ruby 的 Sinatra 的 Presenter 示例

标签 ruby model-view-controller sinatra mvp

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

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

需要说明的是,我已经在使用“Sinatra Up and Running”中定义的 MVC 模式(请参阅:https://github.com/Integralist/sinatra-mvc/ -> 自从我最初创建此存储库以来,我的代码已经更改,但它会给你一个想法我正在使用的 MVC 结构)。

我想要达到的目标...

我对 Presenter 的理解是整理 Model 数据,然后将其传递给 View。然后将其传递回 Controller , Controller 随后呈现 View 。

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

如何实现?

但我不确定如何实现它。有人可以给我举个例子说明我如何做到这一点吗(如果编写一个真实的例子需要大量工作,伪代码就可以了)?

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

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

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

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

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

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

谢谢!

最佳答案

我并不真正了解 Presenter 模式(有意地:)只是当我觉得我没有足够的模式来记住时偶尔阅读的内容……但是这里有一些我知道的用于撰写页面的选项从部分:

Sinatra 部分

您可能想看看 Sinatra Partial (披露:我是维护者),因为它使得将 View 放入 View 或路由中的变量变得非常容易,例如

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

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

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

无论你想要什么逻辑。

mustache

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

Sinatra::ContentFor

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

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

This is a good (even though it's for Rails and from 2007) article关于使用 Forwardable 构建 Presenter。然后你可以将它作为一个对象传递给 contact.erb 模板,但你仍然需要在模板或演示者中放置一些逻辑来处理哪些字段存在。

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

相关文章:

ruby-on-rails - 我可以用更惯用的 Active Record 方式写这个吗?

ruby - 使用不同元素时 ruby​​ 中的 flat_map

ruby-on-rails - 如何查看我机器上安装的 gem 的源代码?

ios - dismissViewControllerAnimated崩溃EXC

ruby - 设置 RubyMine2 以运行和调试 Sinatra 应用程序

ruby-on-rails - 仅当资源具有特定属性时如何过滤搜索集合?

ruby-on-rails - 将 form_for 与嵌套资源结合使用

javascript - Kendo grid - 如何使用 JavaScript 打开弹出编辑窗口

ruby - 将 websocket 连接存储到 redis

ruby - 如何强制 Rack :session + sinatra to read "rack.session" from params instead of cookies