模块化、基于组件的 Sinatra 应用程序的架构

发布于 2024-12-02 16:27:16 字数 650 浏览 0 评论 0原文

我正在开发一个 Sinatra 应用程序,其中包含大约 10 个不同的功能组件。我们希望能够将这些组件混合并匹配到应用程序的单独实例中,完全通过 config.yaml 文件进行配置,如下所示:

components:

- route: '/chunky'
  component_type: FoodLister
  component_settings: 
    food_type: bacon
    max_items: 400

- route: 'places/paris'
  component_type: Mapper
  component_settings: 
    latitude: 48.85387273165654
    longitude: 2.340087890625  

- route: 'places/losangeles'
  component_type: Mapper
  component_settings:
    latitude: 34.043556504127466
    longitude: -118.23486328125

如您所见,组件可以多次实例化,每个组件都有自己的实例上下文设置。

每个组件至少包含一个路由,其中​​配置文件中的“route”属性用于基础组件。

组织和实例化模块代码的最佳方法是什么?

I'm working on a Sinatra app that contains about 10 different components of functionality. We'd like to be able to mix and match these components into separate instances of the application, configured entirely from a config.yaml file that looks something like:

components:

- route: '/chunky'
  component_type: FoodLister
  component_settings: 
    food_type: bacon
    max_items: 400

- route: 'places/paris'
  component_type: Mapper
  component_settings: 
    latitude: 48.85387273165654
    longitude: 2.340087890625  

- route: 'places/losangeles'
  component_type: Mapper
  component_settings:
    latitude: 34.043556504127466
    longitude: -118.23486328125

As you can see, components can be instantiated more than once, each with their own contextual settings.

Each component consists of at least one route, with the "route" property from the config file used for the base.

What is the best way to organize and instantiate the module code?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

百思不得你姐 2024-12-09 16:27:16

这与 include 的提议类似,但它不需要访问rackup 文件。

像这样编写各种处理程序:

class FoodHandler < Sinatra::Base
  get '/chunky/:food' do
    "Chunky #{params[:food]}!"
  end
end

然后在主应用程序文件中:

require './lib/handlers/food_handler.rb'

class Main < Sinatra::Base
  enable :sessions
  ... bla bla bla
  use FoodHandler
end

我已经使用这种结构来构建一些相当复杂的 Sinatra 应用程序。它的扩展性与 Rails 一样好。

编辑

要让您的配置文件定义路由,您可以执行以下操作:

class PlacesHandler < Sinatra::Base
  # Given your example, this would define 'places/paris' and 'places/losangeles'
  CONFIG['components'].select { |c| c['compontent_type'] == 'Mapper' }.each do |c|
    get c['route'] do
      @latitude = c['component_settings']['latitude']
      @longitude = c['component_settings']['longitude']
    end
  end
end

This is similar to include's proposal, but it doesn't require access to the rackup file.

Write your various Handlers like:

class FoodHandler < Sinatra::Base
  get '/chunky/:food' do
    "Chunky #{params[:food]}!"
  end
end

Then in your main application file:

require './lib/handlers/food_handler.rb'

class Main < Sinatra::Base
  enable :sessions
  ... bla bla bla
  use FoodHandler
end

I've used this kind of structure to build some fairly complex Sinatra apps. It scales just as well as Rails.

EDIT

To have your config file define the routes, you could do something like this:

class PlacesHandler < Sinatra::Base
  # Given your example, this would define 'places/paris' and 'places/losangeles'
  CONFIG['components'].select { |c| c['compontent_type'] == 'Mapper' }.each do |c|
    get c['route'] do
      @latitude = c['component_settings']['latitude']
      @longitude = c['component_settings']['longitude']
    end
  end
end
韵柒 2024-12-09 16:27:16

TIMTOWTDI - 还有一种方法可以做:) 这就是其中之一。但实际上我用的是另一种方式。我使用 Sinatra/Base 来开发模块化应用程序。

我有通往每个应用程序的简单路线。

# config.ru file

require 'bundler/setup' Bundler.require(:default)

require File.dirname(__FILE__) + "/main.rb"

map "/" { run BONES::Main }

map "/dashboard" { run BONES::Dashboard }

map "/app1" { run BONES::App1 }

您可以为每个实例设置变量集。
您可以在其模块上开发每个“组件”。

require File.dirname(__FILE__) + "/lib/helpers.rb"

module BONES

  class Main < Sinatra::Base 
    helpers XIXA::Helpers

    configure :development do
      enable  :sessions, :clean_trace, :inline_templates
      disable :logging, :dump_errors
      set :static, true
      set :public, 'public'
    end

    enable :static, :session
    set :root, File.dirname(__FILE__)
    set :custom_option, 'hello'

    set :haml, { :format => :html5 }

    #...

就看这里吧。 http://codex.heroku.com/

玩得开心:)

TIMTOWTDI - There's_more_than_one_way_to_do_it :) and that is one. But in fact I use another way. I use Sinatra/Base to dev modular apps.

I have simgle routes to each app.

# config.ru file

require 'bundler/setup' Bundler.require(:default)

require File.dirname(__FILE__) + "/main.rb"

map "/" { run BONES::Main }

map "/dashboard" { run BONES::Dashboard }

map "/app1" { run BONES::App1 }

You can have variable sets for each instance.
You can develop each 'component' on its Module.

require File.dirname(__FILE__) + "/lib/helpers.rb"

module BONES

  class Main < Sinatra::Base 
    helpers XIXA::Helpers

    configure :development do
      enable  :sessions, :clean_trace, :inline_templates
      disable :logging, :dump_errors
      set :static, true
      set :public, 'public'
    end

    enable :static, :session
    set :root, File.dirname(__FILE__)
    set :custom_option, 'hello'

    set :haml, { :format => :html5 }

    #...

That a look here. http://codex.heroku.com/

have fun :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文