2010-08-02 7 views
1

J'essaye d'obtenir la configuration de Bundler afin que je puisse déployer mon application de Sinatra au serveur avec toutes les gemmes correctes.Sinatra et Bundler

J'ai créé mon Gemfile

source :gemcutter 
gem 'sinatra', '1.0' 
gem "nokogiri", "1.4.2" 
gem "rack", "1.1.0" 
gem "dm-core", "1.0.0" 
gem "dm-migrations", "1.0.0" 
gem "dm-sqlite-adapter", "1.0.0" 
gem "pony", "1.0" 

Ensuite, je créé un Config.ru

require 'rubygems' 
require 'bundler' 
Bundler.setup 

require 'sinatra' 
require 'dm-core' 
require 'dm-migrations' 
require 'dm-sqlite-adapter' 
require 'open-uri' 
require 'nokogiri' 
require 'csv' 
require 'pony' 
require 'parsedate' 
require 'digest/md5' 

require 'MyApp' 
run MyApp 

Jusqu'à présent, si bon, si je courais à côté bundle install et obtenu 'Bundle complet' maintenant tous Je dois faire est juste Rackup

Puis-je obtenir:

config.ru:18: undefined local variable or method `MyApp' for #<Rack::Builder:0x1227350 @ins=[]> (NameError) 
from /usr/local/lib/ruby/gems/1.8/gems/rack-1.1.0/lib/rack/builder.rb:46:in `instance_eval' 
from /usr/local/lib/ruby/gems/1.8/gems/rack-1.1.0/lib/rack/builder.rb:46:in `initialize' 
from config.ru:1:in `new' 
from config.ru:1 

est ici simple MyApp.rb qui déclenchera la même erreur

get '/' do 
    erb :index 
end 

Qu'est-ce qui ne va pas? :(

+0

Pouvez-vous nous montrer votre MyApp.rb? –

+0

Hey, j'ai réduit MyApp.rb à quelque chose qui déclenche la même erreur:/ – Tom

Répondre

9

Si vous indiquez Rack à run MyApp, vous devez d'abord définir la classe MyApp (que vous êtes supposé faire dans MyApp.rb) .Dérivez votre classe à partir de Sinatra :: Base pour en faire une Sinatra-Rack- App qui peut être exécuté à partir config.ru:

require 'sinatra/base' 
class MyApp < Sinatra::Base 
    get '/' do 
    erb :index 
    end 
end 

Voir aussi le README de Sinatra sur les applications modulaires Sinatra (recherche du paragraphe nommé "modulaire Apps" sur http://github.com/sinatra/sinatra/)

+0

Merci, semble fonctionner correctement maintenant. Je ne rencontrerais jamais Sinatra :: Base avant. Juste pour noter que j'ai mis à jour mon Config.ru pour lire "MyApp.run!: Host => 'localhost',: port => 9090" n'a pas réalisé que je devais aussi lier un port là pour le faire démarrer en haut – Tom

+0

Utilisation de MyApp.run! à l'intérieur de config.ru n'est probablement pas ce que vous voulez. MyApp.run!démarre un nouveau processus de serveur qui sert votre application (vous devez donc lui indiquer le port). A l'intérieur de config.ru, vous voulez dire au serveur web déjà lancé (celui qui vient de démarrer et qui est en train d'analyser config.ru, par exemple unicorn) comment diriger les requêtes http vers votre application (en lui disant 'run MyApp' dans config.ru). MyApp.run! démarre un serveur autonome complètement différent qui (afaik) n'utilise pas config.ru, il est destiné à une utilisation autonome (par exemple pendant le développement) et ne doit pas être utilisé dans config.ru. – Zargony

+0

Merci, oui MyApp.Run! Ce n'est absolument pas ce que je voulais du tout. – Tom

0

de plus vous pouvez avoir votre my_app. rb comme suit:

require 'rubygems' 
require 'bundler' 
Bundler.setup 

require 'sinatra' 
require 'dm-core' 
require 'dm-migrations' 
require 'dm-sqlite-adapter' 
require 'open-uri' 
require 'nokogiri' 
require 'csv' 
require 'pony' 
require 'parsedate' 
require 'digest/md5' 

Et votre config.ru comme ceci:

require './my_app' 
run Rack::URLMap.new '/' => Sinatra::Application 

Hope this helps.

Cordialement

ED

+0

L'URLMap ne fait qu'ajouter de la complexité, 'run Sinatra :: Application' donnera le même résultat. –

0

Comme alternative à la création d'une application modulaire (enroulant vos méthodes Sinatra dans une classe extension Sinatra::Base), vous pouvez utiliser:

run Sinatra::Application 

dans le fichier config.ru à la place de

run MyApp 

Ce m Ce serait une meilleure option si vous voulez garder le code Sinatra simple.

Voir the docs for more info.