Datamapper不会将数据保存到数据库中

时间:2010-02-20 16:16:08

标签: ruby sqlite sinatra datamapper

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

这是我的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工作,ruby版本是1.9.1p243(2009-07-16修订版24175)

1 个答案:

答案 0 :(得分:1)

尝试测试Page#update的返回值。如果某些数据无效,则返回false并将Page#errors变量设置为包含所有错误。 (假设您使用的是dm-validations)

顺便说一句,编写该更新行的更简单方法是:

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