我正在使用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)
答案 0 :(得分:1)
尝试测试Page#update的返回值。如果某些数据无效,则返回false并将Page#errors变量设置为包含所有错误。 (假设您使用的是dm-validations)
顺便说一句,编写该更新行的更简单方法是:
@page.update(params.only(:title, :parent_id, :slug, :body))