2013-06-21 46 views
0

我正在製作我的第一個Sinatra應用程序,並且遇到了與數據庫關係有關的問題。我已經嘗試了一切,我知道如何做到這一點(不多),我仍然在撓頭。DataObjects :: SyntaxError幫助需要:Ruby,Sinatra和DataMapper

這是我不斷收到錯誤:

<DataObjects::SyntaxError: 
    ERROR: relation "lovers" does not exist 
    LINE 1: ...ug", "lover_name", "last_updated", "sidebar" 
    FROM "lovers" W...^(code: 16908420, sql state: 42P01, query: 
    SELECT "id", "slug", "lover_name", "last_updated", "sidebar" 
    FROM "lovers" 
    WHERE "slug" = 'home' 
    ORDER BY "id" 
    LIMIT 1, 
    uri: postgres:localhost/keeprdb?scheme=postgres&user=&password=&host=localhost&port=&path=/keeprdb&query=&fragment=&adapter=postgres)> 

這裏是Git的樞紐信息github.com/Jonnyread/keepr

在我怎麼可能去解決這個問題的任何幫助,將不勝感激。

如果您還需要其他東西,請不要猶豫,問問。

因爲我不知道相關的代碼是什麼,這裏的application.rb中的文件:

require 'rubygems' 
    require 'sinatra' 
    require 'sinatra/flash' 
    require 'dm-core' 
    require 'dm-validations' 
    require 'dm-types' 
    require 'dm-migrations' 
    require 'dm-postgres-adapter' 
    require 'rdiscount' 
    require 'rack-ssl-enforcer' 

    DataMapper.setup(:default, ENV['DATABASE_URL'] || 'postgres://localhost/keeprdb') 

    class Lover 
     include DataMapper::Resource 
     property :id,   Serial 
     property :slug,   String 
     property :lover_name, String 
     property :content,  Text 
     property :last_updated, DateTime 
     property :sidebar,  Enum[ :yes, :no ], :default => :no 
    end 

    DataMapper.finalize 

    # Global variables 
    NAV_TITLE = 'Keepr' 
    FOOTER = '<em>"This page is maintained by that wild demi-god Jahmed."</em> -     <strong>All Praises</strong>' 

    # Authentication 
    # use Rack::Auth::Basic, "Restricted Area" do |username, password| 
    # [username, password] == [username, password] 
    # end 

    # Force all connections to use SSL 
    # use Rack::SslEnforcer 

    # Converts page into post slug 
    def slugify(content) 
     content.downcase.gsub(/ /, '-').gsub(/{^a-z0-9_-}/, '').squeeze('-') 
    end 

    # Sets index page as "home" 
    get '/' do 
     redirect '/home/' 
    end 

    # Creates a new lover from "new lover" form 

    post '/' do 
     if params[:userinput].empty? 
      redirect '/' 
     else 
     @lover = Lover.first_or_create(:lover_name => params[:userinput], :slug => slugify(params[:userinput])) 
     @lover.content = "This is a new lover. Congrats! You should write what you remember about her. That is of course if you remember - you animal." 
     @lover.last_updated = DateTime.now 
     @lover.save 
     flash[:notice] = "Lover created successfully. Hope you're that successful too" 
     redirect "/#{@lover.slug}/" 
     end 
    end 

    # List all lovers in the database 
    get '/all/' do 
     @lover = Lover.new 
     @lover.lover_name = 'All Lovers' 
     @lover.slug = 'all' 
     @lovers = Lover.all 
     @sidebars = Lover.all(:sidebar => 'yes') 
     erb :all 
    end 

    # Displays requested lover 
    get '/:url/' do 
     @lover = Lover.first(:slug => params[:url]) 
     if @lover == nil 
      flash[:notice] = "That chick don't exist boy." 
      redirect '/home/' 
     else 
      @lovers = Lover.all 
      @sidebars = Lover.all(:sidebar => 'yes') 
      erb :show 
     end 
    end 

    # Edits requested note 
    get '/:url/edit' do 
     @lover = Lover.first(:slug => params[:url]) 
     @sidebars = Lover.all(:sidebar => 'yes') 
     erb :edit 
    end 

    # Saves user edits to a lover 
    post '/:url/edit' do 
     @lover = Lover.first(:slug => params[:url]) 
     @lover.lover_name = params[:lover_name] 
     @lover.content = params[:content] 
     @lover.sidebar = params[:sidebar] 
@lover.last_updated = DateTime.now 
if lover.slug != 'home' 
    @lover.slug = slugify(params[:lover_name]) 
end 
@lover.save 
flash[:notice] = "Change to Lover is saved. Bitch." 
redirect "/#{@lover.slug}/" 
    end 

    # Readies requested lover for deletion 
    get '/:url/delete' do 
     @lover = Lover.first(:slug => params[:url]) 
     @lovers = Lover.all 
     @sidebars = Lover.all(:sidebar => 'yes') 
     erb :delete 
    end 

    # Deletes specified lover 
    delete '/:url/delete' do 
     @lover = Lover.first(:slug => params[:url]) 
     @lover.destroy 
     flash[:notice] = 'You just dropped that bitch. You should probably go out and find another.' 
     redirect '/home/' 
    end 

    # Redirects user to homepage if a lover is not found 
    not_found do 
     flash[:notice] = "Dude, we all know you didn't book that girl. Straight up." 
     redirect '/home' 
    end 

這裏的錯誤是在部分:

# Displays requested lover 
    get '/:url/' do 
     @lover = Lover.first(:slug => params[:url]) 
     if @lover == nil 
      flash[:notice] = "That chick don't exist boy." 
      redirect '/home/' 
     else 
      @lovers = Lover.all 
      @sidebars = Lover.all(:sidebar => 'yes') 
      erb :show 
     end 
    end 

這裏的Rake文件:

require 'rubygems' 
    require 'sinatra' 
    require 'sinatra/flash' 
    require 'dm-core' 
    require 'dm-validations' 
    require 'dm-types' 
    require 'dm-migrations' 
    require 'dm-postgres-adapter' 
    require 'rdiscount' 
    require 'rack-ssl-enforcer' 

    DataMapper.setup(:default, ENV['DATABASE_URL'] || 'postgres://localhost/keeprdb') 

    class Lover 
     include DataMapper::Resource 
     property :id,   Serial 
     property :slug,   String 
     property :lover_name, String 
     property :content,  Text 
     property :last_updated, DateTime 
     property :sidebar,  Enum[ :yes, :no ], :default => :no 
    end 

    DataMapper.auto_migrate! 

    task :setup do 
     @lover = Lover.create(:slug => 'home') 
     @lover.slug = 'home' 
     @lover.lover_name = 'Home' 
     @lover.content = 'This is the beginning of the next step my man. -Jahmed' 
     @lover.last_updated = DateTime.now 
     @lover.sidebar = :no 
     @lover.save 
    end 

希望這會有所幫助。

再次感謝您的幫助。

+0

您可以發佈相關代碼,特別是您的模型和遷移架構嗎? –

+1

聽起來像遷移沒有運行。你能夠更直接地檢查數據庫並檢查表格嗎? – iain

回答

0

在你application.rb源代碼,立即行

DataMapper.finalize 

添加一行

DataMapper.auto_upgrade! 

::auto_upgrade!試圖使數據庫的模式匹配,你的模型(一個或多個)以下。它根據需要新增表格,並將列添加到現有表格中。欲瞭解更多信息,請參閱:http://datamapper.org/getting-started.html

這是否解決了它?