+5

Tìm hiểu về gem config

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

Viblo
Let's register a Viblo Account to get more interesting posts.