Tìm hiểu về gem config
Bài đăng này đã không được cập nhật trong 8 năm
Giới thiệu
Gem config giúp quản lý và sử dụng dễ dàng các settings trong project. Nói 1 cách đơn giản là tất cả các biến, giá trị cần dùng để cấu hình hệ thống được khai báo tập trung trong 1 hoặc 1 vài file. Khi sử dụng thì chỉ cần dùng câu lệnh rất đơn giản
Ưu điểm
- File config có định dạng YML rất đơn giản
- Hỗ trợ ERB
- Hỗ trợ kế thừa
- Cú pháp sử dụng đơn giản
Cài đặt
Như thường lệ chúng ta thêm vào Gemfile
:
Trên Rails 3 và 4
gem "config"
Khi muốn sử dụng config trước khi khởi tạo ứng dụng. Ta có thể Khai báo như sau:
module Appname
class Application < Rails::Application
Bundler.require(*Rails.groups)
Config::Integration::Rails::Railtie.preload
# ...
config.time_zone = Settings.time_zone
# ...
end
end
Customizing
Để tùy chỉnh các giá trị ta chạy lệnh sau:
rails g config:install
Lệnh trên sẽ sinh ra file config/initializers/config.rb
dùng để config chính gem này. Tiếp đó là các file cho chúng ta tùy ý gán giá trị cần dùng:
- config/settings.yml
- config/settings/development.yml
- config/settings/production.yml
- config/settings/test.yml
Sử dụng
Sau khi generate các file thì mặc định Settings Object là Object toàn cục có thể sử dụng ở bất cứ đâu để gọi các giá trị được khai báo trong các file trên, cú pháp như sau:
Settings.my_config_entry
Trong trường hợp các giá trị khai báo lồng nhau thì cú pháp như sau:
Settings.my_section.some_entry
Cụ thể ví dụ file config/settings.yml của ta như sau:
config/settings.yml
enabled_locales: ["en", "ja"]
client:
host: "localhost:3000"
Ta sẽ gọi như sau:
# Cách 1
[3] pry(main)> Settings.enabled_locales
=> ["en", "ja"]
[4] pry(main)> Settings.client.host
=> "localhost:3000"
# Cách 2
[3] pry(main)> Settings[:enabled_locales]
=> ["en", "ja"]
[4] pry(main)> Settings[:client][:host]
=> "localhost:3000"
Reloading settings
Để reload settings ta dùng lệnh sau:
Settings.reload!
Reloading settings and config files
Ta có thể reload Settings
object từ 1 file config khác trong khi chạy ứng dụng bằng cách sử dụng method reload_from_files
Ví dụ khi muốn reload nhiều file trong môi trường production ta làm như sau:
Rails.env = "production"
Settings.reload_from_files(
Rails.root.join("config", "settings.yml").to_s,
Rails.root.join("config", "settings", "#{Rails.env}.yml").to_s,
Rails.root.join("config", "environments", "#{Rails.env}.yml").to_s
)
File config cho từng môi trường
Ta có thể cấu hình cụ thể các file cho từng môi trường. Config thuộc file này sẽ được ưu tiên hơn so với các config thông thường
Ví dụ với môi trường development ta khai báo như sau:
#{Rails.root}/config/environments/development.yml
Tương tự với môi trường production:
#{Rails.root}/config/environments/production.yml
Adding sources at Runtime
Nếu ta không muốn load tất cả các config ngay khi khởi tạo ứng dụng. Ta có load file config YML trong khi chạy ứng dụng với lệnh sau:
Settings.add_source!("/path/to/source.yml")
Settings.reload!
Lệnh trên sẽ đọc file source.yml
rồi thêm hoặc ghi đè(trường hợp config đã có trước đó) vào list config
Ngoài ra ta có thể thêm file config vào trước các file mặc định. Bằng cách sau:
Settings.prepend_source!("/path/to/source.yml")
Settings.reload!
Method prepend_source!
cũng tuơng tự như add_source
, nhưng với prepend_source!
thì file YML sẽ được thêm vào trước các file đã load trước đó. Tức là các config trong file này sẽ không thể ghi đè lên các config đã được load trước đó.
Embedded Ruby (ERB)
Cú pháp Ruby có thể sử dụng trong các file YML. Ta cùng xem ví dụ dưới đây để hiểu rõ hơn:
#{Rails.root}/config/settings.yml
size: 1
server: google.com
#{Rails.root}/config/environments/development.yml
size: 2
computed: <%= 1 + 2 + 3 %>
section:
size: 3
servers: [ {name: yahoo.com}, {name: amazon.com} ]
**Lưu ý: **Với mỗi môi trường sử dụng, thì config chỉ định cho môi trường đó sẽ được ưu tiên hơn:
#Gọi thông thường config không chứa cú pháp Ruby
Settings.size # => 2 vì mình chạy Rails c trên development nên sẽ trả về 2
Settings.server # => google.com
Settings.computed # => 6 là kết quả của 1 + 2 + 3
Settings.section.size # => 3
#Gọi config với array
Settings.section.servers[0].name # => yahoo.com
Settings.section.servers[1].name # => amazon.com
Như vậy tùy mục đích sử dụng mà ta hoàn toàn có thể sử dụng cú pháp của ruby trong file yml để xây dựng ứng dụng
All rights reserved