Sinatra / CouchDB ошибка? - PullRequest
       7

Sinatra / CouchDB ошибка?

1 голос
/ 20 июня 2010

Я работаю над своим первым проектом 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.

Любая помощь будет принята с благодарностью!

РЕДАКТИРОВАТЬ:

См. мой ответ ниже.

Ответы [ 2 ]

3 голосов
/ 22 июня 2010

После долгих поисков я обнаружил, что серия 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 голосов
/ 20 июня 2010

попробуйте требовать 'patina' после установки: db.Я думаю, что тело класса Article выполняет метод use_database до того, как параметр существует.

вы должны иметь возможность поместить Article в article.rb (соглашение об именах ruby ​​- UpperCamel для классов, но under_scores для файлов, в которыхклассы определены), а затем требуется 'article' в patina.rb.

, это единственное, что выделилось для меня, поэтому дайте мне знать, если это работает.

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