Ruby on rails 如何在Rails应用程序模板中使用postgres?

Ruby on rails 如何在Rails应用程序模板中使用postgres?,ruby-on-rails,postgresql,Ruby On Rails,Postgresql,我正在为一个应用程序创建一个自定义模板,并添加了pg以替代sqlite: gem 'pg' gsub_file "Gemfile", /^gem\s+["']sqlite3["'].*$/,'' after_bundle do generate "rspec:install" generate "simple_form:install" end 但是,如果我像这样创建应用程序,database.yml文件,如果默认情况下将为sqlite3配置,那么我如何指定应用程序来从我的模板添加

我正在为一个应用程序创建一个自定义模板,并添加了pg以替代sqlite:

gem 'pg'

gsub_file "Gemfile", /^gem\s+["']sqlite3["'].*$/,''

after_bundle do
  generate "rspec:install"
  generate "simple_form:install"
end

但是,如果我像这样创建应用程序,database.yml文件,如果默认情况下将为sqlite3配置,那么我如何指定应用程序来从我的模板添加
postgresql
的配置?正如我添加了
--database=postgresql
选项一样,不需要向用户询问应用程序名称,因为
应用程序名称已经填充了它

命令对于处理文件非常有用,可以使用
.erb
模板,并使用以下命令从模板传递值:

database.erb:

default: &default
  adapter: postgresql
  host: db 
  port: 5432
  pool: 5
  timeout: 5000
  user: postgres
  password: postgres

development:
  <<: *default
  database: <%= app_name %>_development

test:
  <<: *default
  database: <%= app_name %>_test

production:
  <<: *default
  database: <%= app_name %>_production
default:&default
适配器:postgresql
主持人:db
港口:5432
游泳池:5
超时:5000
用户:postgres
密码:postgres
发展:

我的做法有点不同。这是我的
模板.rb

remove_file 'config/database.yml'

file 'config/database.yml', <<-CODE
  # PostgreSQL. Versions 9.1 and up are supported.
  #
  # Install the pg driver:
  #   gem install pg
  # On OS X with Homebrew:
  #   gem install pg -- --with-pg-config=/usr/local/bin/pg_config
  # On OS X with MacPorts:
  #   gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config
  # On Windows:
  #   gem install pg
  #       Choose the win32 build.
  #       Install PostgreSQL and put its /bin directory on your path.
  #
  # Configure Using Gemfile
  # gem 'pg'
  #
  default: &default
    adapter: postgresql
    encoding: unicode
    # For details on connection pooling, see Rails configuration guide
    # http://guides.rubyonrails.org/configuring.html#database-pooling
    pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

  development:
    <<: *default
    database: foo_development

    # The specified database role being used to connect to postgres.
    # To create additional roles in postgres see `$ createuser --help`.
    # When left blank, postgres will use the default role. This is
    # the same name as the operating system user that initialized the database.
    #username: foo

    # The password associated with the postgres role (username).
    #password:

    # Connect on a TCP socket. Omitted by default since the client uses a
    # domain socket that doesn't need configuration. Windows does not have
    # domain sockets, so uncomment these lines.
    #host: localhost

    # The TCP port the server listens on. Defaults to 5432.
    # If your server runs on a different port number, change accordingly.
    #port: 5432

    # Schema search path. The server defaults to $user,public
    #schema_search_path: myapp,sharedapp,public

    # Minimum log levels, in increasing order:
    #   debug5, debug4, debug3, debug2, debug1,
    #   log, notice, warning, error, fatal, and panic
    # Defaults to warning.
    #min_messages: notice

  # Warning: The database defined as "test" will be erased and
  # re-generated from your development database when you run "rake".
  # Do not set this db to the same as development or production.
  test:
    <<: *default
    database: foo_test

  # As with config/secrets.yml, you never want to store sensitive information,
  # like your database password, in your source code. If your source code is
  # ever seen by anyone, they now have access to your database.
  #
  # Instead, provide the password as a unix environment variable when you boot
  # the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database
  # for a full rundown on how to provide these environment variables in a
  # production deployment.
  #
  # On Heroku and other platform providers, you may have a full connection URL
  # available as an environment variable. For example:
  #
  #   DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase"
  #
  # You can use this database configuration with:
  #
  #   production:
  #     url: <%= ENV['DATABASE_URL'] %>
  #
  production:
    <<: *default
    database: foo_production
    username: foo
    password: <%= ENV['FOO_DATABASE_PASSWORD'] %>
CODE
删除文件'config/database.yml'

文件'config/database.yml',我编辑了标题,因为它实际上与RSpec没有任何关系-当您运行
RSpec:install
时,错误恰好弹出。我想这可能是因为
database.yml
文件仍然将
sqlite
列为适配器。我在创建应用程序时运行了--database=postgresql,而
database.yml
postgresql
作为适配器。这与模板无关,即使我不使用它,我也必须安装sqlite3 gem。在看了你最后的评论之后,我想知道这个问题是否已经解决了。如果这个问题还没有解决,您能否显示您的
数据库.yml
文件(当然,密码已被删除:)?我已经看到了你上面关于
database.yml
的评论,但我仍然认为看一下可能会有帮助。是的,错误与此无关,我必须安装gem。我更新了这个问题,因为我想运行模板并使用postgresql,而不需要任何额外的步骤或选项。如果您想查看rails本身是如何根据--database选项的值来选择它的,请查看文件rails/railties/lib/rails/generators/rails/app/app_generator.rb(rails版本5.1.0.alpha)。
remove_file 'config/database.yml'

file 'config/database.yml', <<-CODE
  # PostgreSQL. Versions 9.1 and up are supported.
  #
  # Install the pg driver:
  #   gem install pg
  # On OS X with Homebrew:
  #   gem install pg -- --with-pg-config=/usr/local/bin/pg_config
  # On OS X with MacPorts:
  #   gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config
  # On Windows:
  #   gem install pg
  #       Choose the win32 build.
  #       Install PostgreSQL and put its /bin directory on your path.
  #
  # Configure Using Gemfile
  # gem 'pg'
  #
  default: &default
    adapter: postgresql
    encoding: unicode
    # For details on connection pooling, see Rails configuration guide
    # http://guides.rubyonrails.org/configuring.html#database-pooling
    pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

  development:
    <<: *default
    database: foo_development

    # The specified database role being used to connect to postgres.
    # To create additional roles in postgres see `$ createuser --help`.
    # When left blank, postgres will use the default role. This is
    # the same name as the operating system user that initialized the database.
    #username: foo

    # The password associated with the postgres role (username).
    #password:

    # Connect on a TCP socket. Omitted by default since the client uses a
    # domain socket that doesn't need configuration. Windows does not have
    # domain sockets, so uncomment these lines.
    #host: localhost

    # The TCP port the server listens on. Defaults to 5432.
    # If your server runs on a different port number, change accordingly.
    #port: 5432

    # Schema search path. The server defaults to $user,public
    #schema_search_path: myapp,sharedapp,public

    # Minimum log levels, in increasing order:
    #   debug5, debug4, debug3, debug2, debug1,
    #   log, notice, warning, error, fatal, and panic
    # Defaults to warning.
    #min_messages: notice

  # Warning: The database defined as "test" will be erased and
  # re-generated from your development database when you run "rake".
  # Do not set this db to the same as development or production.
  test:
    <<: *default
    database: foo_test

  # As with config/secrets.yml, you never want to store sensitive information,
  # like your database password, in your source code. If your source code is
  # ever seen by anyone, they now have access to your database.
  #
  # Instead, provide the password as a unix environment variable when you boot
  # the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database
  # for a full rundown on how to provide these environment variables in a
  # production deployment.
  #
  # On Heroku and other platform providers, you may have a full connection URL
  # available as an environment variable. For example:
  #
  #   DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase"
  #
  # You can use this database configuration with:
  #
  #   production:
  #     url: <%= ENV['DATABASE_URL'] %>
  #
  production:
    <<: *default
    database: foo_production
    username: foo
    password: <%= ENV['FOO_DATABASE_PASSWORD'] %>
CODE