【问题标题】:Ruby DataMapper save from modelRuby DataMapper 从模型中保存
【发布时间】:2011-09-04 08:34:29
【问题描述】:

我尝试从模型对象中保存一些数据,但没有任何反应:( 我哪里不对?

class Gallery
  include DataMapper::Resource

  property :id, Serial
  property :title, String
  property :user, String
  property :album, String
  property :place, String
  property :fotki, Text
  property :date, Date
  property :created_at, DateTime

  default_scope(:default).update(:order => [:created_at.desc])

  def get_images
    if @fotki.nil? then
      fotki = Fotki.get(@user, @album)
      self.update(:fotki => fotki.to_json)
      puts 'Request'
      fotki
    else
      puts 'Use Cache'
      JSON.parse(@fotki)
    end
  end
end

【问题讨论】:

  • 你到底想做什么?阅读您的代码并不清楚。我不相信update 接受这样的:order,因为它不是选择查询,而是更新。除此之外,您永远不应该尝试直接从类的主体内部写入数据。添加一个方法并显式调用它。每当类碰巧被加载到内存中时,该代码就会运行,这很糟糕。
  • 我使用外部服务来存储照片。并使用它的 API 来获取为 :user 和 :album number 指定的照片 URL。然后我明白了我想在数据库中缓存数据而不是将来的新请求。我像这样调用 gallery = Gallery.get(params[:id]);照片 = 图库.get_images
  • gallery.errors 包含什么?当我第一次发表评论时,我有些困惑,关于 default_scope 电话的用途。这不是一个非常清晰的界面,但无论如何都是DM。我现在学到了一些东西!
  • Nothing :( pry(#)> errors => #<:validations::validationerrors:0x00000001b0f918>

标签: ruby datamapper


【解决方案1】:

datamapper 中存在一个错误,可能导致以下情况:

resource = SomeModel.new(attributes_from_somewhere)
resource.valid? # => true
resource.save   # => false, and no db interaction
resource.saved? # => false

无法保存的有效资源。无声的失败。

使用raise_on_save_failre 设置可以解决这个静默失败问题。但是异常信息仍然没有意义。只谈论返回 false 的 #save ;)。

在保留对特定属性无效的值时会出现问题。例如,date 属性中的布尔值或非强制字符串。

使用fix 时,datamapper 将在为属性保留无效值时引发有意义的异常。遗憾的是,目前没有包含该修复程序的版本。您必须尝试来自https://github.com/datamapper/dm-core 的主分支!

免责声明:我是该修复程序的作者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多