Cách xác định các biến cấu hình tùy chỉnh trong đường ray


337

Tôi đã tự hỏi làm thế nào để thêm các biến cấu hình tùy chỉnh vào một ứng dụng rails và làm thế nào để truy cập chúng trong bộ điều khiển, ví dụ tôi muốn có thể định nghĩa upload_directory trong các tệp cấu hình nói là Development.rb và có thể truy cập nó trong một trong các bộ điều khiển.

Thứ hai, tôi đã lên kế hoạch để có hỗ trợ S3 để tải lên trong ứng dụng của mình, nếu tôi muốn thêm tệp yaml với quyền truy cập s3, khóa bí mật, làm cách nào để khởi tạo nó trong Ứng dụng Rails của tôi và làm cách nào để truy cập các giá trị mà tôi đã xác định trong tập tin cấu hình đó.



Liên quan một chút: Đừng quên khởi động lại máy chủ khi thêm các biến cấu hình mới.
Damien Ó Ceallaigh

Câu trả lời:


165

Cập nhật 1

Rất khuyến khích: Hiện tại tôi đang sử dụng đá quý Rails Config để kiểm soát chi tiết tốt mà nó cung cấp.

Cập nhật2

Nếu bạn muốn có giải pháp nhanh chóng, hãy xem câu trả lời của Jack Pratt bên dưới.

Mặc dù câu trả lời ban đầu của tôi dưới đây vẫn hoạt động, câu trả lời này hiện đã lỗi thời. Tôi khuyên bạn nên xem cập nhật 1 và 2.

Câu trả lời gốc:

Để có giải pháp nhanh chóng, việc xem màn hình "Tệp cấu hình YAML" do Ryan Bates thực hiện sẽ rất hữu ích.

Tóm tắt:

# config/initializers/load_config.rb
APP_CONFIG = YAML.load_file("#{Rails.root}/config/config.yml")[Rails.env]

# application.rb
if APP_CONFIG['perform_authentication']
  # Do stuff
end

62
Câu trả lời này là lỗi thời. Xem stackoverflow.com/questions/1450285/ bên dưới
mattwynne

8
@matt: Đã lỗi thời vì Rails 3 đã được phát hành hay vì mọi người hiện đang ở trên Rails 3, hoặc ...?
Lasse V. Karlsen

Cảm ơn đã chỉ ra lỗi thời. Tôi ghét điều đó về Rails - mã từ 1 năm trước là quá cũ.
jcollum

2
Đối với bất kỳ ai muốn sử dụng phương pháp YAML trong Rails 3+, bạn sẽ phải thay thế RAILS_ENVbằng Rails.envRAILS_ROOTbằng Rails.root.
Ryan

Tôi đã thử rails_config. Trong tài liệu họ hướng dẫn tôi đăng ký RailsConfig trong ứng dụng của mình.rb. Tôi giả sử rằng app.rb = config / application.rb. Nhưng tôi nên đặt dòng RailsConfig ở đâu trong application.rb?
Nhím Cảnh Báo

375

Trong Rails 3, dữ liệu cấu hình tùy chỉnh cụ thể của Ứng dụng có thể được đặt trong đối tượng cấu hình ứng dụng. Cấu hình có thể được chỉ định trong các tệp khởi tạo hoặc tệp môi trường - giả sử cho một ứng dụng nhất định MyApp:

MyApp::Application.config.custom_config_variable = :my_config_setting

hoặc là

Rails.configuration.custom_config_variable = :my_config_setting

Để đọc cài đặt, chỉ cần gọi biến cấu hình mà không cần đặt:

Rails.configuration.custom_config_variable
=> :my_config_setting

CẬP NHẬT Rails 4

Trong Rails 4 có một cách mới cho việc này => http://guides.rubyonrails.org/configuring.html#custom-configuration

nhập mô tả hình ảnh ở đây


11
Nó làm việc cho tôi. Tôi đặt cài đặt cấu hình cụ thể cho môi trường của mình trong môi trường / {môi trường} .rb, ví dụ: môi trường / Development.rb. Hãy chắc chắn rằng bạn khởi động lại máy chủ của bạn sau khi sửa đổi. Có thể có nhiều kỹ thuật tao nhã hơn, nhưng tôi đang nâng cấp một ứng dụng hiện có trước đây đã sử dụng ENV ['XXX'] trong cùng một tệp và vì tôi muốn hạn chế số lần tái cấu trúc trong quá trình nâng cấp, nên việc này đã hoạt động tốt.
pduey

13
Đây là bài tập nhưng làm thế nào để bạn truy cập giá trị này sau đó?
kevzettler

9
Nếu bạn tìm trong application.rb của ứng dụng rails 3.x thì đó là "Cấu hình ứng dụng sẽ đi vào các tệp trong cấu hình / bộ khởi tạo" theo câu trả lời này. Có rất nhiều tài liệu về cách truy cập biến ( edgeguides.rubyonrails.org/configuring.html ). vd . @Jack Pratt bạn có thể chỉnh sửa một câu trả lời đầy đủ hơn?
jamesc

48
Dude, đơn giản: Đường dẫn: config/environments/production.rb Cấu hình: config.whatever = false Truy cập nó ở bất cứ đâu: Rails.configuration.whatever
Victor S

5
Xin lưu ý rằng nếu bạn đặt một cái gì đó chỉ trong sản xuất và cố gắng truy cập nó trong một môi trường khác, nó sẽ phàn nàn undefined method.
lulalala

69

Trong Rails 3.0.5, cách tiếp cận sau đây có hiệu quả với tôi:

Trong config/environments/development.rb, viết

config.custom_config_key = :config_value

Giá trị custom_config_keysau đó có thể được tham chiếu từ các tệp khác bằng cách sử dụng

Rails.application.config.custom_config_key

4
Xin lưu ý rằng nếu bạn đặt một cái gì đó chỉ trong sản xuất và cố gắng truy cập nó trong một môi trường khác, nó sẽ phàn nàn undefined method.
lulalala

Tôi đã thử điều này trong rails 4.1 và tôi đang gặp lỗi, "... method_missing': undefined method store 'cho # <Rails :: Application :: Cấu hình: 0x007f9f735b7240> ...". Tôi đã cố gắng thêm biến cấu hình "config.store.works".
Spundun

1
@Spundun Bạn đang gặp phải lỗi đó, vì Rails không biết nó storelà gì . Để sử dụng phương thức trong câu trả lời này, bạn có thể đổi tên biến của mình store_workshoặc tạo một config.storekhối có worksđịnh nghĩa trong đó.
Paul Pettengill

Cảm ơn, cuối cùng tôi đã tìm ra điều đó. Rằng đây là các giá trị băm lồng nhau, vì vậy tôi phải khởi tạo các giá trị băm trống theo cách đệ quy nếu tôi sử dụng dấu chấm trong tên cấu hình của mình.
Spundun

31

Điều này hoạt động trong đường ray 3.1:

trong config / môi trường.rb (hoặc trong config / môi trường / .. để nhắm mục tiêu một môi trường cụ thể):

YourApp::Application.config.yourKey = 'foo'

Điều này sẽ có thể truy cập trong bộ điều khiển hoặc các khung nhìn như thế này:

YourApp::Application.config.yourKey

(YourApp nên được thay thế bằng tên ứng dụng của bạn.)

Lưu ý : Đó là mã Ruby, vì vậy nếu bạn có nhiều khóa cấu hình, bạn có thể thực hiện việc này:

trong cấu hình / môi trường.rb:

YourApp::Application.configure do
  config.something = foo
  config.....
  config....
  .
  config....
end

2
camelCase: o sử dụng Snake_case!
siegy22

30

Trong đường ray 4

Giả sử bạn đặt các biến tùy chỉnh của mình vào tệp yaml:

# config/acme.yml
development:
  :api_user: 'joe'
  :api_pass: 's4cret'
  :timeout: 20

Tạo một trình khởi tạo để tải chúng:

# config/initializers/acme.rb
acme_config = Rails.application.config_for :acme

Rails.application.configure do
  config.acme = ActiveSupport::OrderedOptions.new
  config.acme.api_user = acme_config[:api_user]
  config.acme.api_pass = acme_config[:api_pass]
  config.acme.timeout  = acme_config[:timeout]
end

Bây giờ bất cứ nơi nào trong ứng dụng của bạn, bạn có thể truy cập các giá trị này như sau:

Rails.configuration.acme.api_user

Đó là thuận tiện Rails.application.config_for :acmesẽ tải của bạn acme.ymlvà sử dụng môi trường chính xác.


21

Vì Rails 4.2, không có đá quý bổ sung, bạn có thể tải config / hi.yml chỉ bằng cách sử dụng Rails.application.config_for :hi.

Ví dụ:

  1. touch config/passwords.yml

        #config/passwords.yml
        development:
          username: 'a'
          password: 'b'
        production:
          username: 'aa'
          password: 'bb'
  1. touch config/initializers/constants.rb

    #config/initializers/constants.rb
    AUTHENTICATION = Rails.application.config_for :passwords
  1. và bây giờ bạn có thể sử dụng AUTHENTICATIONhằng số ở mọi nơi trong ứng dụng của mình:

    #rails c production
    :001> AUTHENTICATION['username'] => 'aa'
  2. sau đó thêm mật khẩu.yml vào .gitignore : echo /config/passwords.yml >> .gitignore, tạo tệp ví dụ để bạn thoải mái cp /config/passwords.yml /config/passwords.example.ymlvà sau đó chỉ cần chỉnh sửa tệp ví dụ của bạn trong bảng điều khiển sản xuất với các giá trị sản xuất thực tế.


13

Tôi chỉ muốn cập nhật cái này cho những thứ hay ho mới nhất trong Rails 4.2, bây giờ bạn có thể làm điều này trong bất kỳ config/**/*.rbtệp nào của bạn :

config.x.whatever.you.want = 42

... và điều này sẽ có sẵn trong ứng dụng của bạn dưới dạng:

Rails.configuration.x.whatever.you.want

Xem thêm tại đây: http://guides.rubyonrails.org/configuring.html#custom-configuration


8

Kiểm tra viên ngọc gọn gàng này làm chính xác điều đó: https://github.com/mislav/choices

Bằng cách này, dữ liệu nhạy cảm của bạn sẽ không bị lộ trong các dự án nguồn mở


4

Tôi tạo ra một plugin đơn giản để cài đặt YAML: Yettings

Nó hoạt động theo kiểu tương tự như mã trong câu trả lời của khelll, nhưng bạn chỉ cần thêm tệp cấu hình YAML này:

app/config/yetting.yml

Plugin tự động tạo một lớp cho phép bạn truy cập các cài đặt YML dưới dạng các phương thức lớp trong ứng dụng của bạn như sau:

Yetting.your_setting

Ngoài ra, nếu bạn muốn sử dụng nhiều tệp cài đặt với các tên duy nhất, bạn có thể đặt chúng trong thư mục con bên trong ứng dụng / config như thế này:

app/config/yettings/first.yml
app/config/yettings/second.yml

Sau đó, bạn có thể truy cập các giá trị như thế này:

FirstYetting.your_setting
SecondYetting.your_setting

Nó cũng cung cấp cho bạn các cài đặt mặc định có thể bị ghi đè trên mỗi môi trường. Bạn cũng có thể sử dụng erb bên trong tệp yml.


Bản repo chính thức hiện có tại: github.com/charlotte-ruby/yinstall (nhà phê bình SO đã từ chối bản chỉnh sửa của tôi nói rằng nó quá nhỏ)
lulalala


4

Nếu bạn sử dụng Heroku hoặc nếu không có nhu cầu giữ các cài đặt ứng dụng của bạn làm biến môi trường, đá quý figaro rất hữu ích.


2

Tôi thích sử dụng cài đặt rails cho các giá trị cấu hình toàn cầu cần thay đổi thông qua giao diện web.


2
Tôi không muốn sử dụng các plugin bổ sung, v.v., vì tôi đang học đường ray, vì vậy cách tốt nhất để làm điều đó là không có bất kỳ plugin nào.
Shiv

Lưu ý điều này sử dụng cơ sở dữ liệu để lưu trữ cấu hình, có thể quá nặng đối với một số người.
lulalala

0

Một cái gì đó chúng tôi bắt đầu làm tại nơi làm việc là ActiveSupport Ordered Hash

Điều này cho phép bạn xác định rõ cấu hình của mình bên trong các tệp môi trường, vd

config.service = ActiveSupport::OrderedOptions.new
config.service.api_key = ENV['SERVICE_API_KEY']
config.service.shared_secret = ENV['SERVICE_SHARED_SECRET']

-5

Tôi sẽ đề nghị cách tiếp cận tốt để đối phó với cấu hình trong ứng dụng của bạn. Có ba quy tắc cơ bản:

  • thay đổi cấu hình của bạn không phải là mã;
  • sử dụng cấu hình trong điều kiện;
  • viết mã có nghĩa là một cái gì đó.

Để có tổng quan chi tiết hơn, hãy theo liên kết sau: Cấu hình Rails theo cách thích hợp

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.