簡體   English   中英

hanami-model 集成到 ruby​​ 項目

[英]hanami-model integration to ruby project

我的應用程序的結構:

.
├── config
│   ├── boot.rb
│   └── environment.rb
├── Gemfile
├── Gemfile.lock
├── lib
│   ├── entities
│   │   └── account.rb
│   └── repositories
│       └── account_repository.rb
└── README.md

寶石檔案:

source 'https://rubygems.org'

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

配置/環境.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, ENV['DATABASE_URL']
        end.load!
      end
    end
  end
end

配置/boot.rb:

require_relative './environment'
App.boot

lib/entities/account.rb:

require 'hanami/model'
require_relative '../repositories/account_repository'

class Account < Hanami::Entity
end

lib/repositories/account_repository.rb:

require 'hanami/model'
require_relative '../entities/account'

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

在控制台中,我運行以下代碼,但出現錯誤:

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)

我究竟做錯了什么? 如果您將所有實體代碼和存儲庫放在一個文件中,則代碼運行時不會出錯。

問題在於加載順序。

以下是有關文檔中嚴格順序的說明:

使用 sql 適配器時,必須在 Hanami::Model.load 之前要求 hanami/model/sql! 被調用以便正確加載關系。

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

因此,對於您的情況,需要在所有聲明后運行App.boot

詳細說明:

如果將所有代碼放在一個文件中,您會看到不同之處:

# 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

gems/rom-3.3.3/lib/rom/registry.rb:30:in `fetch': key cannot be nil (ArgumentError)

在 Repository 和 Entity 定義之后移動App.boot ,如下所示:

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

{:accounts=>#<ROM::Relation[Accounts] name=accounts dataset=#<Sequel::Postgres::Dataset: "SELECT * FROM \"accounts\"">>

您缺少“根”配置/選項(我不太了解,因為我不使用Hanami)。

我是怎么找到的?

查看堆棧跟蹤:

(所有鏈接都指向最新,因為我很懶:))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM