Ruby on Rails:在应用模板中重写database_yml方法自定义database.yml
自定义Rails database.yml:重写AppBuilder的database_yml方法
完全可以通过重写AppBuilder中的database_yml方法来实现自定义database.yml,以下是具体实现方案:
实现步骤
- 在你的模板文件(
template.rb)中,通过class_eval重写AppBuilder的database_yml方法:
# template.rb def self.source_paths [__dir__] end # 重写AppBuilder的database_yml方法,接管配置生成逻辑 Rails::Generators::AppGenerator::AppBuilder.class_eval do def database_yml # 方式1:读取本地预定义的模板文件生成 template "config/databases/postgresql.yml", "config/database.yml" # 方式2:直接在方法内编写动态配置内容(无需本地模板文件) # create_file "config/database.yml", <<~YML # default: &default # adapter: postgresql # encoding: unicode # pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> # host: <%= ENV.fetch("DB_HOST") { "localhost" } %> # # development: # <<: *default # database: <%= app_name %>_development # # test: # <<: *default # database: <%= app_name %>_test # # production: # <<: *default # database: <%= app_name %>_production # username: <%= ENV["DB_USER"] %> # password: <%= ENV["DB_PASSWORD"] %> # YML end end
- 保持原有的目录结构不变(如果使用方式1的本地模板):
├── config │ └── databases │ └── postgresql.yml └── template.rb
- 运行应用创建命令:
rails new foo -m /path/to/template.rb
原理说明
AppBuilder是Rails应用生成器的核心构建类,其中的database_yml方法负责生成默认的database.yml配置文件。通过class_eval重写该方法,可完全替代Rails的默认生成逻辑,既支持读取预定义模板文件,也能结合应用参数、环境变量动态生成配置,比直接替换文件的方式更贴合Rails生成器的原生流程。
内容的提问来源于stack exchange,提问作者yskkin
相关产品推荐
相关产品推荐

