Leon's Blogging

Coding blogging for hackers.

用 Yaml 來寫文件, 設定檔

| Comments

yaml 格式經常會在 rails 裡看到,像是 config 裡的 database.yml,或 en.yml
這種格式經常拿來寫一些固定的常數。

因此也可以拿來設定網頁中固定的像是選單之類的文件。

自訂 yaml

sample.yml

1
2
3
4
5
6
7
option:
  - a:  foo
    a1: bar
  - b:  foo
    b1: bar
  - c:  foo
    c1: bar

: hash
- array

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
require "yaml"

SAMPLE = YAML.load(File.read(File.expand_path('../sample.yml', __FILE__))).symbolize_keys.freeze

or

SAMPLE = YAML.load_file('sample.yml')

#=> {"option"=>
#        [
#            {"a"=>"foo", "a1"=>"bar"}, 
#            {"b"=>"foo", "b1"=>"bar"}, 
#            {"c"=>"foo", "c1"=>"bar"}
#        ]
#    }

symbolize_keys

symbolize_keys
freeze

設定檔

/config 底下建立 yml & yml.example
並將 yml 的放進 .gitignore ,避免敏感資訊,傳到 github 上面

上 production 的時候,再將 example 的複製過來,將密碼改成 production 的即可。

/config/fb.yml

1
2
3
4
5
6
7
development:
  app_id: xxxxxxxxxxxxxxxx
  secret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

production:
  app_id: xxxxxxxxxxxxxxxx
  secret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

然後再需要的地方就可以直接使用了

1
2
3
fb_config = Rails.application.config_for(:fb)
fb_config["app_id"] #=> xxxxxxxxxxxxxxxx
fb_config["secret"] #=> xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

在 yaml 寫 ruby code

config/urls.yml

1
2
3
4
5
6
7
8
development:
  PATH: <%= Rails.public_path %>

test:
  PATH: <%= Rails.public_path %>
  
production:
  PATH: <%= Rails.public_path %>

config/initializers/load_config.rb

1
2
#用 ERB.new().result 將檔案讀出時,透過此 method 轉成 ruby code
URL = YAML.load(ERB.new(File.read("#{Rails.root}/config/urls.yml")).result)[Rails.env].symbolize_keys.freeze
1
2
3
config_for(:urls)
Rails.application.config_for(:urls)
#自動就會判斷環境設定

也可以用 rails 內建的 config_for 來讀取 .yml 檔案

config_for

官方文件:
Yaml
ERB.html

參考文件:
Using ERB in YAML Configuration File

Comments