Ruby on Rails: разница между поведением в консоли / в файле .rb - PullRequest
0 голосов
/ 04 октября 2018

Я хотел бы использовать информацию, хранящуюся в файле credentials.yml.enc для приложения Rails 5.2.Тем не менее, я изо всех сил пытаюсь получить команду, которая прекрасно работает в консоли, чтобы вести себя таким же образом при вставке в файл .rb.

В консоли Rails (на моем локальном компьютере разработки) Rails.application.credentials.usernameвозвращает "my_username"

Если я вставлю эту строку в очень простой файл db_backup.rb, как показано ниже, я получу ошибку:

NameError: uninitialized constant #<Class:#<Backup::Config::DSL:0x00007fb0db941d10>>::Rails

db_backup.rb:

Model.new(:db_backup, 'Description for db_backup') do
  ##
  # PostgreSQL [Database]
  #
  database PostgreSQL do |db|
    db.username           = Rails.application.credentials.username
  end
end

Не могли бы вы объяснить, почему я получаю другое поведение при использовании точно такой же строки кода в консоли Rails / в файле .rb?

Ответы [ 3 ]

0 голосов
/ 06 октября 2018

@ giglemad дает отличное объяснение проблемы разрешения классов в контексте выполнения (консоль rails или запуск резервного файла ruby).

Чтобы исправить ошибку, просто сообщите коду об использованиипоиск класса верхнего уровня (::Rails):

Model.new(:db_backup, 'Description for db_backup') do
  ##
  # PostgreSQL [Database]
  #
  database PostgreSQL do |db|
    db.username = ::Rails.application.credentials.username
  end
end

Если вы все еще видите отсутствующую константу Rails, вам нужно поместить свой сценарий в задачу rake или потребовать рельсыокружающая среда.

0 голосов
/ 14 октября 2018

В итоге я решил эту проблему, просто добавив строку ниже в верхнюю часть моего db_backup.rb:

require './config/environment'  # added to enable credentials to be read from Rails environment 
0 голосов
/ 04 октября 2018

Контекст, в котором выполняется код, не совпадает.Одна - это консоль rails, а другая - команда резервного копирования

Что происходит, когда вы загружаете консоль Rails

Запуск консоли rails означает, что вы запускаете весь стек rails перед выполнением своего кода для него,Приложения Rack, такие как Sinatra, Rails и т. Д., Используют файл config.ru в качестве соглашения, для которого файл должен быть запущен для загрузки.(Вы можете исследовать кроличью нору, если хотите иметь глубокое понимание этого)

Это означает, что подавляющее большинство ошибок, с которыми вы можете столкнуться во время загрузки консоли, не позволяет вам выполнить что-либо вконсоль (потому что загрузка не удалась).Вместо этого он напечатает ошибки трассировки стека, чтобы вы могли выяснить, что пошло не так, чтобы вы могли исправить и повторить попытку.

TL;DR Rails.application.credentials.username в консоли выполняется после загрузки всего стека Rails (моделей, зависимостей, инициализаторов) в определенном порядке

Что происходит при запуске команды резервного копирования

Здесь определена команда backup в репозитории для репозитория резервного копирования

Она выглядит следующим образом

#!/usr/bin/env ruby
# encoding: utf-8

require File.expand_path("../../lib/backup", __FILE__)
Backup::CLI.start

Если вы откроете нужный файлlib/backup.rb и посмотрите в Gemfile, вы не найдете места, где у вас есть зависимость или определение для константы Rails.

Таким образом, когда вы запускаете команду backup и выполняете ваш db_backup.rb, константа Rails, вызываемая здесь, ... не определена.Ruby, будучи добрым, попытается найти вложенную версию этой константы в текущей области видимости, которая является блоком Model.new do; end.

Пока не определено, о чем вам говорит рубин с помощью NameError: uninitialized constant #<Class:#<Backup::Config::DSL:0x00007fb0db941d10>>::Rails.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...