2010-06-20 53 views
1

我正在开发我的第一个Sinatra/CouchDB项目,并且遇到了一个我无法解释的错误。Sinatra/CouchDB错误?

这里是我的rackup(config.ru)文件:

require 'rubygems' 
require 'couchrest' 
require 'patina' 

set :environment, :development 
set :root, File.dirname(__FILE__) 
set :run, false 

FileUtils.mkdir_p 'log' unless File.exists?('log') 
log = File.new("log/sinatra.log", "a") 
$stdout.reopen(log) 
$stderr.reopen(log) 

set :db, CouchRest.database!("http://127.0.0.1:5984/test") 

run Sinatra::Application 

而这里的应用程序文件(patina.rb):

require 'rubygems' 
require 'sinatra' 
require 'couchrest' 
require 'haml' 

class Article < CouchRest::ExtendedDocument 
    use_database settings.db 

    property :title 
    timestamps! 
    view_by :title 
end 

get '/' do 
    @db = settings.db 
    haml :index 
end 

如果没有patina.rb类定义,路线返回,显示一个页面@db财产,因为我期待。但是,当我将类定义添加到patina.rb时,我得到“Ruby(机架)应用程序无法启动”错误消息。

显然这与我的类定义有关,但我无法弄清楚问题是什么,错误信息似乎对我没有帮助。另外,我实际上更喜欢在一个单独的文件(Article.rb)中有类定义,但我无法弄清楚如何在我的Sinatra应用程序的上下文中执行此操作。

任何帮助将不胜感激!

编辑:

请参阅下面的答案。

回答

3

经过大量的谷歌搜索,我发现1.4系列json.gem已知会引起很多问题。我卸载了我所有的json宝石,并安装了json-1.2.4.gem。我现在一切正常。下面是我使用的设置:

config.ru(Rackup文件):

require 'application' 

set :environment, :production 
set :root, File.dirname(__FILE__) 
set :run, false 

FileUtils.mkmdir_p 'log' unless File.exists?('log') 
log = File.new('log/sinatra.log', 'a+') 
$stdout.reopen(log) 
$stderr.reopen(log) 

run Sinatra::Application 

environment.rb

require 'rubygems' 
require 'couchrest' 
require 'haml' 
require 'ostruct' 

require 'sinatra' unless defined?(Sinatra) 

configure do 
    SiteConfig = OpenStruct.new(
    :title => 'Application Title', 
    :author => 'Your Name', 
    :url_base => 'Your URL', 
    :url_base_db => 'Your CouchDB Server', 
    :db_name => "Your DB Name" 
) 

    # load models 
    $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/lib") 
    Dir.glob("#{File.dirname(__FILE__)}/lib/*.rb") { |lib| require File.basename(lib, '.*') } 
end 

lib/contact.rb(型号例如environment.rb,模型自动加载):

class Contact < CouchRest::ExtendedDocument 
    include CouchRest::Validation 
    use_database CouchRest.database!((SiteConfig.url_base_db || '') + SiteConfig.db_name) 

    property :name 
    timestamps! 

    view_by :name 
end 

application.rb

require 'rubygems' 
require 'sinatra' 
require 'environment' 

configure do 
    set :views, "./views" 
end 

error do 
    e = request.env['sinatra.error'] 
    Kernel.puts e.backtrace.join("\n") 
    'Application error' 
end 

helpers do 
end 

get '/new/?' do 
    haml :new 
end 

post '/save/?' do 
    @contact_name = params[:contact_name] 

    @contact = Contact.new 
    @contact.name = @contact_name 
    @contact.save 

    haml :save 
end 

get '/' do 
    haml :index 
end 

希望这可以帮助未来的人!

+0

谢谢,感谢sinatra坚持沙发的例子。 – 2011-03-10 14:18:47

0

尝试在设置后需要'古色':db。在设置存在之前,我认为Article的类体正在执行use_database方法。

你应该可以把article放在article.rb中(ruby命名约定是UpperCamel的类,但under_scores是定义类的文件),然后在patina.rb中需要'article'。

这是唯一突出的我,所以让我知道,如果这样的作品。

+0

嗨,本 - 感谢您的回复。随着这些变化,我得到了一个不同的错误:'定义方法'设置为#'... – safetycopy 2010-06-20 01:40:23

+0

其定义在sinatra。rb,需要'sinatra'在机架上 – 2010-06-20 02:00:17

+0

这只是让我回到我原来的错误:'堆栈层面太深':( – safetycopy 2010-06-20 02:21:33