2

Sinatra を使用して MVC と一緒に Presenter パターンを実装する方法がわかりません。

私はたくさんの投稿を読みましたが、興味のある特定のユースケースに焦点を当てたものはありません.

明確にするために、「Sinatra Up and Running」で定義されている MVC パターンを既に使用しています (参照: https://github.com/Integralist/sinatra-mvc/ -> このリポジトリを最初に作成してからコードが変更されました)しかし、それは私が使用している MVC 構造のアイデアを提供します)。

私が達成しようとしていること...

プレゼンターについての私の理解は、モデル データを照合してからビューに渡すことです。次に、ビューをレンダリングするコントローラーにそれを渡します。

私がプレゼンター パターンを使用したい理由は、コントローラーをきれいに保つだけでなく、「コンポーネント」(HTML のチャンク) で構成されるページを構成できるようにすることで、別のページでいくつかのコンポーネントを再利用できるようにするためです。

実装方法は?

しかし、これを実装する方法がわかりません。これを行う方法の例を教えてください(実際の例を書くのが大変な場合は、疑似コードで問題ありません)。

これが私がどのように見えるかを示すサンプルコードですが、私が考えていることが正しいかどうか、または実装がどのように機能するかはわかりません(さまざまなことを試しましたが、方法の理解が不足しているため問題が発生しましたシナトラはカバーの下で働いています)...

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

私は 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 の統合と例もあります。

シナトラ::ContentFor

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

私はそれを使ったことはありませんが、私はそれが存在し、Sinatra Partial と同様のことをすることを知っています。

これは (Rails 向けであり、2007 年以降のものですが)Forwardable Presenter の構築に使用するための優れた記事です。次に、それを 1 つのオブジェクトとしてテンプレートに渡すことができますがcontact.erb、存在するフィールドを処理するために、テンプレートまたはプレゼンターに何らかのロジックを配置する必要があります。

于 2013-10-19T02:29:34.697 に答える