2010-02-20 57 views
2

我正在使用Sinatra和Datamapper在Ruby中编写一个简单的应用程序,并且遇到了麻烦 - 当我尝试将数据保存到SQLite数据库时,没有任何更改。但是,当我尝试安装数据库或从irb更改数据时,它可以很好地工作。Datamapper不会将数据保存到数据库中

,这里是我的DataMapper的设置,模型和数据库安装方法(这工作正常):

 
DataMapper.setup(:default, "sqlite3://#{File.dirname(__FILE__)}/db.sqlite") 

class Page 
    include DataMapper::Resource 

    property :id,   Serial 
    property :parent_id, Integer 
    property :title,  String, :length => 0..255 
    property :slug,  String, :length => 0..255 
    property :body,  Text 
    property :created_at, DateTime 

    def children 
    Page.all(:parent_id => self.id) 
    end 

    def install 
    DataMapper.auto_migrate! 

    Page.new(:parent_id => 0, 
      :title => "Main", 
      :slug => "/", 
      :body => "This is the Main Page. Replace it's text with yours", 
      :created_at => Time.now).save! 

    end 
end 

下面是一段代码,无法正常工作:

 
post %r{/admin/edit/([\d]+)/?} do 
    protected! 
    #works fine and gets a row from database 
    @page = Page.get(params[:captures].first) 
    #update doesn't work, the save! method doesn't work too 
    @page.update :title => params[:title], 
       :parent_id => params[:parent_id], 
       :slug => params[:slug], 
       :body => params[:body] 
    redirect request.path_info 
end 

这工作正常在irb中:

 
p = Page.get(1) 
p.update :title => "testing update" 

有谁知道有什么问题?

P.S:我目前在Windows 7中工作,红宝石版本是1.9.1p243(2009-07-16修订24175)

+0

哦,我忘了写在这里的解决方案。为了让这件事情起作用,我不得不将to_i方法应用于params [:parent_id]。 – 2010-03-12 07:35:38

回答

1

尝试测试页#更新的返回值。如果某些数据无效,它将返回false并将页面错误设置为所有错误。 (假设你使用的DM-验证)

BTW,编写更新线路简单的方法是:

@page.update(params.only(:title, :parent_id, :slug, :body)) 
+0

另外,我想,Sinatra并不象征参数的关键。顺便说一下,'only'是一个相当整洁的extlib散列扩展。 – BaroqueBobcat 2010-02-20 21:06:27

+0

我试过你的建议。更新方法现在返回true,但仍不保存数据。保存! Methos具有相同的行为。 – 2010-02-21 03:55:59

相关问题