2

Ruby で Sinatra と Datamapper を使用して簡単なアプリケーションを作成していますが、SQLite データベースにデータを保存しようとしても何も変化しません。しかし、データベースをインストールしたり、irb からデータを変更しようとすると、完全に機能します。

これが私のDatamapperのセットアップ、モデル、およびデータベースのインストール方法です(これはうまくいきます):

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

クラスページ
  インクルード DataMapper::Resource

  プロパティ:id、シリアル
  プロパティ:parent_id、整数
  プロパティ:タイトル、文字列、:長さ => 0..255
  プロパティ:スラッグ、文字列、:長さ => 0..255
  プロパティ:本体、テキスト
  プロパティ:created_at、DateTime

  デフォルトの子供
    Page.all(:parent_id => self.id)
  終わり

  デフインストール
    DataMapper.auto_migrate!

    Page.new(:parent_id => 0,
             :title => "メイン",
             :slug => "/",
             :body => "これはメインページです。テキストをあなたのものに置き換えてください",
             :created_at => Time.now).save!

  終わり
終わり

そして、正しく動作しないコードは次のとおりです。

post %r{/admin/edit/([\d]+)/?} する
  保護された!
  #正常に動作し、データベースから行を取得します
  @page = Page.get(params[:captures].first)
  #更新が機能しない、保存! メソッドも機能しません
  @page.update :title => params[:title],
                :parent_id => params[:parent_id],
                :slug => params[:slug],
                :body => params[: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 に答える