【问题标题】:Sinatra/CouchDB error?Sinatra/CouchDB 错误?
【发布时间】:2010-06-20 01:02:10
【问题描述】:

我正在处理我的第一个 Sinatra/CouchDB 项目,但遇到了一个我无法解释的错误。

这是我的机架 (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 (Rack) 应用程序”错误消息。

显然这与我的类定义有关,但我无法弄清楚问题出在哪里,并且错误消息似乎对我没有帮助。

此外,我实际上更喜欢将类定义放在单独的文件 (Article.rb) 中,但我不知道如何在我的 Sinatra 应用程序的上下文中执行此操作。

任何帮助将不胜感激!

编辑:

请看下面我的回答。

【问题讨论】:

    标签: ruby couchdb sinatra


    【解决方案1】:

    经过大量谷歌搜索,我发现json.gem1.4 系列已知会导致很多问题。我卸载了我拥有的所有 json gem 并安装了json-1.2.4.gem。我现在一切正常。这是我正在使用的设置:

    config.ru(备份文件):

    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
    

    希望这对将来的某人有所帮助!

    【讨论】:

    • 谢谢,欣赏sinatra坚持沙发的例子。
    【解决方案2】:

    在设置 :db 后尝试要求 'patina'。我认为Article的类体在设置存在之前执行了use_database方法。

    您应该能够将 Article 放在 article.rb 中(ruby 命名约定是 UpperCamel 用于类,但 under_scores 用于定义类的文件)然后在 patina.rb 中需要 'article'。

    这是对我来说唯一突出的东西,所以如果它有效,请告诉我。

    【讨论】:

    • 嗨,本 - 感谢您的回复。通过这些更改,我得到了一个不同的错误:undefined method set' for #<:builder:0xb7b95a0c>`...
    • 它在 sinatra.rb 中定义,在 rackup 中需要 'sinatra'
    • 这让我回到原来的错误:stack level too deep :(
    • 跟踪大约有 3000 行:/ 不过,我想我现在可以正常工作了 - 请参阅上面的编辑。不知道为什么它会这样工作,但至少它是进步:)
    猜你喜欢
    • 2014-07-10
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 2015-06-07
    • 2016-04-13
    相关资源
    最近更新 更多