Архитектура для модульного компонентного приложения Sinatra - PullRequest
10 голосов
/ 01 сентября 2011

Я работаю над приложением 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» из файла конфигурации, используемого для базы.

Как лучше всего организовать и создать экземпляр кода модуля?

Ответы [ 2 ]

10 голосов
/ 04 сентября 2011

Это похоже на предложение включения, но не требует доступа к файлу стойки.

Напишите ваши различные обработчики, такие как:

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.

EDIT

Чтобы ваш конфигурационный файл определял маршруты, вы можете сделать что-то вроде этого:

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
2 голосов
/ 02 сентября 2011

TIMTOWTDI - There_more_than_one_way_to_do_it :) и это один. Но на самом деле я использую другой способ. Я использую 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/

веселись :) 1012 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...