【问题标题】:DataMapper says TypeError: no implicit conversion from nil to integerDataMapper 说 TypeError:没有从 nil 到整数的隐式转换
【发布时间】:2014-06-07 16:45:41
【问题描述】:

我有一个非常简单的表,几乎是一个键/值存储,类似于

class Device
    include DataMapper::Resource
    property :token,    Text, :key => true
end

当然我在定义它之后会调用DataMapper.finalize,因为我使用的是 Sinatra。

当我创建一个新设备时,像这样

Device.create(:token => "Foo Bar")

我得到了所有这些巨大的垃圾场

~ (0.000063) SET sql_auto_is_null = 0
~ no implicit conversion from nil to integer
TypeError: no implicit conversion from nil to integer
    from /Library/Ruby/Gems/2.0.0/gems/data_objects-0.10.14/lib/data_objects/quoting.rb:12:in `quote_string'
    from /Library/Ruby/Gems/2.0.0/gems/data_objects-0.10.14/lib/data_objects/quoting.rb:12:in `quote_value'
    from /Library/Ruby/Gems/2.0.0/gems/data_objects-0.10.14/lib/data_objects/command.rb:69:in `block in escape_sql'
    from /Library/Ruby/Gems/2.0.0/gems/data_objects-0.10.14/lib/data_objects/command.rb:62:in `gsub!'
    from /Library/Ruby/Gems/2.0.0/gems/data_objects-0.10.14/lib/data_objects/command.rb:62:in `escape_sql'
    from /Library/Ruby/Gems/2.0.0/gems/dm-do-adapter-1.2.0/lib/dm-do-adapter/adapter.rb:114:in `execute_non_query'
    from /Library/Ruby/Gems/2.0.0/gems/dm-do-adapter-1.2.0/lib/dm-do-adapter/adapter.rb:114:in `block (2 levels) in create'
    from /Library/Ruby/Gems/2.0.0/gems/dm-do-adapter-1.2.0/lib/dm-do-adapter/adapter.rb:276:in `with_connection'
    from /Library/Ruby/Gems/2.0.0/gems/dm-do-adapter-1.2.0/lib/dm-do-adapter/adapter.rb:113:in `block in create'
    from /Library/Ruby/Gems/2.0.0/gems/dm-do-adapter-1.2.0/lib/dm-do-adapter/adapter.rb:85:in `each'
    from /Library/Ruby/Gems/2.0.0/gems/dm-do-adapter-1.2.0/lib/dm-do-adapter/adapter.rb:85:in `create'
    from /Library/Ruby/Gems/2.0.0/gems/dm-core-1.2.1/lib/dm-core/repository.rb:146:in `create'
    from /Library/Ruby/Gems/2.0.0/gems/dm-core-1.2.1/lib/dm-core/resource/persistence_state/transient.rb:74:in `create_resource'
    from /Library/Ruby/Gems/2.0.0/gems/dm-core-1.2.1/lib/dm-core/resource/persistence_state/transient.rb:25:in `commit'
    from /Library/Ruby/Gems/2.0.0/gems/dm-core-1.2.1/lib/dm-core/resource.rb:963:in `_persist'
    from /Library/Ruby/Gems/2.0.0/gems/dm-core-1.2.1/lib/dm-core/resource.rb:977:in `block in create_with_hooks'
    from /Library/Ruby/Gems/2.0.0/gems/dm-core-1.2.1/lib/dm-core/resource.rb:974:in `catch'
    from /Library/Ruby/Gems/2.0.0/gems/dm-core-1.2.1/lib/dm-core/resource.rb:974:in `create_with_hooks'
    from /Library/Ruby/Gems/2.0.0/gems/dm-core-1.2.1/lib/dm-core/resource.rb:1028:in `save_self'
    from /Library/Ruby/Gems/2.0.0/gems/dm-validations-1.2.0/lib/dm-validations.rb:54:in `save_self'
    from /Library/Ruby/Gems/2.0.0/gems/dm-core-1.2.1/lib/dm-core/resource.rb:1013:in `block in _save'
    from /Library/Ruby/Gems/2.0.0/gems/dm-core-1.2.1/lib/dm-core/resource.rb:1229:in `run_once'
    from /Library/Ruby/Gems/2.0.0/gems/dm-core-1.2.1/lib/dm-core/resource.rb:1012:in `_save'
    from /Library/Ruby/Gems/2.0.0/gems/dm-core-1.2.1/lib/dm-core/resource.rb:412:in `save'
    from /Library/Ruby/Gems/2.0.0/gems/dm-validations-1.2.0/lib/dm-validations.rb:40:in `block in save'
    from /Library/Ruby/Gems/2.0.0/gems/dm-validations-1.2.0/lib/dm-validations/context.rb:16:in `in_context'
    from /Library/Ruby/Gems/2.0.0/gems/dm-validations-1.2.0/lib/dm-validations.rb:40:in `save'
    from /Library/Ruby/Gems/2.0.0/gems/dm-validations-1.2.0/lib/dm-validations.rb:130:in `create'
    from (irb):19
    from /usr/bin/irb:12

当我在 Sinatra 中运行完全相同的代码时,当然会发生非常相似的事情。我正在运行 Ruby 2.0,以防万一不清楚。

有什么线索吗?

编辑:由于时间限制,我后来搬到了 Rails,但我喜欢 Sinatra,我仍然希望完成这项工作,所以如果有人有想法,我仍然非常欢迎他们.

【问题讨论】:

  • 你跑DataMapper.auto_migrate!了吗?如果不运行,请告诉我。
  • 我的数据存储中已经有一个模式,没有必要运行它,但只是为了好玩我运行它(在完成后,因为你甚至应该在 Sinatra 中运行它应用程序?),我得到了几乎完全相同的转储(除了几个行号等)。
  • 很奇怪。它非常适合我的 DataMapper+Sqlite+Ruby 2.0 设置。 Device.all #=> [#<Device @token="Foo Bar">]
  • @kiddorails,事实上我可以毫无问题地获取所有Devices,但我似乎无法让它创建新的。
  • @Morpheu5 上面的列表(在我的输出中)是由Device.create(:token => "Foo Bar") 自己创建的。

标签: ruby sinatra datamapper


【解决方案1】:

我花了几个小时试图在 Ubuntu 14.04 上解决这个确切的问题(值得信赖)。这似乎完全是荒谬的,试图在数据对象 gem 中调试问题是徒劳的。

我的解决方案:卸载libmariadbclient-dev,安装libmysqlclient-dev,重新部署,终于成功了。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我遇到了完全相同的问题,并且还在使用 Ruby 2.0(OS X Mavericks 上的默认 ruby​​)。升级到 2.1.2 解决了这个问题。

    如果您实际使用的是 OS X,我建议您通过 RVM 安装

    \curl -sSL https://get.rvm.io | bash -s stable --ruby
    

    【讨论】:

      猜你喜欢
      • 2015-04-08
      • 1970-01-01
      • 2019-02-26
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-01
      • 2020-03-15
      相关资源
      最近更新 更多