2

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

这是我的 Datamapper 的设置、模型和数据库安装方法(效果很好):

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

班级页面
  包括 DataMapper::Resource

  属性:id,序列号
  属性:parent_id,整数
  属性:标题,字符串,:长度=> 0..255
  属性:slug,字符串,:长度 => 0..255
  属性:正文,文本
  属性:created_at,日期时间

  定义儿童
    Page.all(:parent_id => self.id)
  结尾

  默认安装
    DataMapper.auto_migrate!

    Page.new(:parent_id => 0,
             :title => "主要",
             :slug => "/",
             :body => "这是主页。用你的替换它的文本",
             :created_at => Time.now).save!

  结尾
结尾

这是一段无法正常工作的代码:

发布 %r{/admin/edit/([\d]+)/?} 做
  受保护!
  #工作正常并从数据库中获取一行
  @page = Page.get(params[:captures].first)
  #update 不起作用,保存!方法也不行
  @page.update :title => 参数[:title],
                :parent_id => 参数[:parent_id],
                :slug => 参数[:slug],
                :body => 参数[:body]
  重定向 request.path_info
结尾

这在 irb 中工作正常:

p = Page.get(1)
p.update :title => "测试更新"

有谁知道有什么问题?

PS:我目前在 Windows 7 中工作,ruby 版本是 1.9.1p243(2009-07-16 修订版 24175)

4

1 回答 1

1

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

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

@page.update(params.only(:title, :parent_id, :slug, :body))
于 2010-02-20T17:37:53.417 回答