Datamapper не сохраняет данные в базу данных - PullRequest
2 голосов
/ 20 февраля 2010

Я пишу простое приложение на 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 Ответ

1 голос
/ 20 февраля 2010

Попробуйте проверить возвращаемое значение обновления # страницы. Если некоторые данные были неверными, они вернут false и установят переменную Page # errors со всеми ошибками (при условии, что вы используете dm-проверки)

Кстати, более простой способ написать эту строку обновления:

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