首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与ruby项目集成的hanami模型

与ruby项目集成的hanami模型
EN

Stack Overflow用户
提问于 2019-03-22 20:18:14
回答 2查看 133关注 0票数 3

我的应用程序的结构:

代码语言:javascript
复制
.
├── config
│   ├── boot.rb
│   └── environment.rb
├── Gemfile
├── Gemfile.lock
├── lib
│   ├── entities
│   │   └── account.rb
│   └── repositories
│       └── account_repository.rb
└── README.md

Gemfile:

代码语言:javascript
复制
source 'https://rubygems.org'

gem 'pg', '~> 1.1'
gem 'dotenv'
gem 'byebug'
gem 'hanami-model'

config/environment.rb ment.rb:

代码语言:javascript
复制
require 'bundler/setup'
require 'hanami/model'
require 'dotenv/load'

class App
  class << self
    def boot
      Mutex.new.synchronize do
        Hanami::Model.configure do
          adapter :sql, ENV['DATABASE_URL']
        end.load!
      end
    end
  end
end

config/boot.rb:

代码语言:javascript
复制
require_relative './environment'
App.boot

lib/entities/account.rb:

代码语言:javascript
复制
require 'hanami/model'
require_relative '../repositories/account_repository'

class Account < Hanami::Entity
end

lib/repositories/account_repository.rb:

代码语言:javascript
复制
require 'hanami/model'
require_relative '../entities/account'

class AccountRepository < Hanami::Repository
   self.relation = :accounts
end

在控制台中,我运行以下代码,并得到一个错误:

代码语言:javascript
复制
irb -I .
irb(main):001:0> require 'config/boot'
=> true
irb(main):002:0> require 'lib/repositories/account_repository'
=> true
irb(main):003:0> rep = AccountRepository.new
Traceback (most recent call last):
        6: from /home/mvalitov/.asdf/installs/ruby/2.5.1/bin/irb:11:in `<main>'
        5: from (irb):3
        4: from (irb):3:in `new'
        3: from /home/mvalitov/.asdf/installs/ruby/2.5.1/lib/ruby/gems/2.5.0/gems/hanami-model-1.3.2/lib/hanami/repository.rb:420:in `initialize'
        2: from /home/mvalitov/.asdf/installs/ruby/2.5.1/lib/ruby/gems/2.5.0/gems/rom-repository-1.4.0/lib/rom/repository/root.rb:62:in `initialize'
        1: from /home/mvalitov/.asdf/installs/ruby/2.5.1/lib/ruby/gems/2.5.0/gems/rom-3.3.3/lib/rom/registry.rb:30:in `fetch'
ArgumentError (key cannot be nil)

我做错了什么?如果您将所有实体代码和存储库放在一个文件中,则代码运行时不会出现错误。

EN

回答 2

Stack Overflow用户

发布于 2021-10-30 17:38:30

问题出在加载顺序上。

以下是文档中关于严格顺序的说明:

在使用sql适配器时,必须在Hanami::Model.load!之前使用hanami/

/sql!将被调用,以便正确加载关系。

来源:https://github.com/hanami/model#mapping

因此,对于您的情况,需要在所有声明之后运行App.boot

具体内容如下:

如果您将所有代码放入一个文件中,您将看到不同之处:

代码语言:javascript
复制
# run.rb
require 'bundler/setup'
require 'hanami/model'
require 'dotenv/load'
class App
  class << self
    def boot
      Mutex.new.synchronize do
        Hanami::Model.configure do
          adapter :sql, 'postgresql://postgres:12345@localhost:5432/mame-challenge_development'
          path '/home/mifrill/Documents/source/hamani-bug'
        end.load!
      end
    end
  end
end
App.boot
class AccountRepository < Hanami::Repository
  self.relation = :accounts
end
class Account < Hanami::Entity
end
AccountRepository.new

ruby run.rb

代码语言:javascript
复制
gems/rom-3.3.3/lib/rom/registry.rb:30:in `fetch': key cannot be nil (ArgumentError)

App.boot移到存储库和实体定义之后,如下所示:

代码语言:javascript
复制
require 'bundler/setup'
require 'hanami/model'
require 'dotenv/load'
class App
  class << self
    def boot
      Mutex.new.synchronize do
        Hanami::Model.configure do
          adapter :sql, 'postgresql://postgres:12345@localhost:5432/mame-challenge_development'
          path '/home/mifrill/Documents/source/hamani-bug'
        end.load!
      end
    end
  end
end
class AccountRepository < Hanami::Repository
  self.relation = :accounts
end
class Account < Hanami::Entity
end
App.boot
AccountRepository.new

ruby run.rb

代码语言:javascript
复制
{:accounts=>#<ROM::Relation[Accounts] name=accounts dataset=#<Sequel::Postgres::Dataset: "SELECT * FROM \"accounts\"">>

因此,尝试在load!之前要求存储库文件来解决:

config/boot.rb

代码语言:javascript
复制
require_relative './environment'
require_relative '../lib/repositories/account_repository'
App.boot
代码语言:javascript
复制
irb -I .
require 'config/boot'
rep = AccountRepository.new
...
{:accounts=>#<ROM::Relation[Accounts] name=accounts dataset=#<Sequel::Postgres::Dataset: "SELECT * FROM \"accounts\"">>}
票数 1
EN

Stack Overflow用户

发布于 2019-03-22 20:32:21

您缺少"root“配置/选项(我不太了解,因为我不使用Hanami)。

我怎么找到的?

查看堆栈跟踪:

(所有链接都指向最新版本,因为我很懒:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55299444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档