2015-02-24 19 views
5

Tôi đã thay đổi database.yml của mình để sử dụng cơ sở dữ liệu sqlite3 trong thử nghiệm và phát triển và postgresql trong sản xuất. Ứng dụng của tôi chạy tốt trong sản xuất nhưng khi tôi khởi động thử nghiệm hoặc phát triển environements tôi có lỗi này:không thể tải 'rails.application.database_configuration' phương thức chưa xác định '[]' cho nil: NilClass

Cannot load 'Rails.application.database_configuration': 
undefined method'[]' for nil:NilClass (NoMethoError) 

database.yml của tôi:

# SQLite version 3.x 
# gem install sqlite3 
# 
# Ensure the SQLite 3 gem is defined in your Gemfile 
# gem 'sqlite3' 
# 
default: &default 
    adapter: sqlite3 
    pool: 5 
    timeout: 5000 

development: 
    <<: *default 
    database: db/development.sqlite3 

# 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: db/test.sqlite3 

production: 
    pool: 5 
    timeout: 5000 
    encoding: utf8 
    adapter: postgresql 
    host: <%= Rails.application.secrets[:database][:host]%> 
    database: <%= Rails.application.secrets[:database][:name]%> 
    username: <%= Rails.application.secrets[:database][:username]%> 
    password: <%= Rails.application.secrets[:database][:password]%> 

Trả lời

-3
host: <%= Rails.application.secrets[:database][:host]%> 
database: <%= Rails.application.secrets[:database][:name]%> 
username: <%= Rails.application.secrets[:database][:username]%> 
password: <%= Rails.application.secrets[:database][:password]%> 

Ôi Chúa, không làm điều này. Đừng làm điều này vì nhiều lý do.

Sử dụng ENV vars trên máy chủ sản xuất thay vì:

host: <%= ENV['DB_HOST'] %> 
database: <%= ENV['DB_NAME'] %> 
username: <%= ENV['DB_USER'] %> 
password: <%= ENV['DB_PASSEWORD'] %> 

Sau đó, bạn muốn đi vào máy chủ sản của bạn và thiết lập các biến trong tập tin cấu hình shell của bạn (.bashrc, zshrc, .profile) như sau :

export DB_HOST=your_host 
export DB_NAME=your_name 
export DB_USER=your_user 
export DB_PASSWORD=your_password 

vấn đề của bạn là 1 trong tổng số 2 điều có thể:

a. Điều kiện chủng tộc nơi cấu hình cơ sở dữ liệu đang được tải trước tệp bí mật.

b. Bạn có secret.yml của bạn phân đoạn được môi trường và không có các nút cho môi trường phát triển/thử nghiệm.

+0

nhờ đưa tôi vào đường ray tốt, nguyên nhân là nút mất tích trong secrets.yml – scauglog

+2

như vậy .. nó nắm để thêm một 'database' phần cho 'development' và' môi trường test' trong' secrets.yml'. đúng? –

+0

Tôi đang sử dụng biến 'ENV' cho kết nối cơ sở dữ liệu và tôi đã đặt các cài đặt của mình bên trong' secrets.yml' .. tuy nhiên khi chạy 'rails s' và cố gắng truy cập ứng dụng đường ray, tôi nhận được lỗi này' Truy cập bị từ chối cho người dùng 'root' @ 'localhost' (sử dụng mật khẩu: NO) '.. Bất kỳ ý tưởng nào? – Lykos

1

Ngoài Về an ninh

Nếu bạn đang đi để đi tuyến đường này, đó là tốt, bạn cần phải chắc chắn một điều rất quan trọng:

tập tin secrets.yml của bạn là được cung cấp một cách an toàn , không kiểm tra vào kiểm soát nguồn, và không thể đọc được bởi bất cứ ai không nên có truy cập

Trong trường hợp đó nó không kém an toàn hơn so với việc có một khóa xuống *key/*crt file chứng chỉ fo r máy chủ web của bạn, ngoại trừ việc bạn có khả năng lưu trữ nhiều bí mật. Thực hiện việc này chính xác là thích hợp hơn để đặt bí mật trong ENV, nhưng vẫn còn các tùy chọn tốt hơn.

Một số đọc thêm:

Vấn đề thực tế của bạn

Vấn đề của bạn là @ Ý tưởng thứ hai tagCincy của ("b "), và kỳ quặc đủ, đây là siêu dễ dàng để sửa chữa. Chỉ cần làm những gì @ Nik-Olai đề xuất.Khai báo (mặc dù trống) giá trị của các thông số tương tự trong dev/môi trường kiểm tra của bạn như thế này:

development: 
    ... 
    database: 
    :name: 
    :username: 
    :password: 

test: 
    # same thing here 

Lý do là, trong khi cấu hình production cơ sở dữ liệu không được sử dụng trong development hoặc test môi trường, phân tích cú pháp của cấu hình đó sẽ vẫn xảy ra.

Đặt một cách khác, cài đặt cơ sở dữ liệu sản xuất của bạn sẽ vẫn được phân tích cú pháp (và ERB phiên dịch) ngay cả trong chế độ thử nghiệm/dev.

Rails.application.secrets phụ thuộc vào môi trường, vì vậy ở chế độ dev và kiểm tra Rails.application.secrets[:database] sẽ không tồn tại, có nghĩa là cuộc gọi [] tiếp theo sẽ đạt được mục tiêu nil và thì đấy!

1

Bắt đầu với Rails 5.1.0 mới bằng cách thêm các biến của tôi vào với tệp được mã hóa bí mật mới.

Nil của bạn đang xảy ra bởi vì mặc dù nó đang phát triển nó vẫn cố gắng tải mọi thứ và bạn đang gọi những thứ từ nil -> một cái gì đó [: nil] [: cant_grab_from_nil]. Cách giải quyết nhanh là một câu lệnh if. Chỉ đề xuất điều này khi sử dụng các tệp bí mật được mã hóa trong Rails 5.1 mới.

production: 
    pool: 5 
    timeout: 5000 
    encoding: utf8 
    adapter: postgresql 
    <% if Rails.application.secrets[:database].present? %> 
    host: <%= Rails.application.secrets[:database][:host]%> 
    database: <%= Rails.application.secrets[:database][:name]%> 
    username: <%= Rails.application.secrets[:database][:username]%> 
    password: <%= Rails.application.secrets[:database][:password]%> 
    <% end %> 
Các vấn đề liên quan