在 Rails 內建立類似 database.yml 的設定文件(global settings)


#1

嗯,這邊寫下如何建立 Global settings 的做法,有很多 gem 提供相同的目的,不過我這邊寫自幹的方式唄

首先,在 config/application.rb 上增加幾行

# Bundler.require(:default, Rails.env) #這行之後,Rails 4.x
# Bundler.require(*Rails.groups) # 這行之後,Rails 5.x

require 'yaml'
$settings = YAML.load(File.open("#{__dir__}/settings.yml"))[Rails.env.to_sym]

其實這樣就結束了,再來是 config/settings.yml 的格式

---
:development:
  :redis:
    :host: '127.0.0.1'
    :port: '6379'
  :per_page: 10
:production:
  :redis:
    :host: '111.1.1.1'
    :port: '6379'
  :per_page: 100

之後你就可以在不同的環境下,取到不同的

$settings[:per_page]

之後記得,把 config/settings.yml 複製成 config/settings.yml.backup (裡面的資料要清空),並把 config/settings.yml 增加到 .gitignore 內,以後 deploy / dev 環境建立時複製一份即可,這樣做就可以讓機敏資料不上 git

這樣開發起來非常方便快速,且 API key 之類的也不會上 git 之類的,以上


在同一個domain下執行多個rails
#2

在 Rails 4.2 以上就不需要這麼麻煩自幹,其實 Rails 有幫你做好了配套,這裡順便介紹 config_for 的用法:

config/application.rb:

module MyRailsExample # 這裏是你本來的 Rails 專案名稱
  class Application < Rails::Application # 寫在 Application 裡面就可以使用 config_for 了
    $settings = config_for(:settings) # 這裡會自動依據你的 Rails.env 來讀取,不需要自己取出
  end
end

這個方法也是 Rails 自己拿來讀取 database.yml 的做法,所以一樣可以使用 ERB 嵌套,例如:

config/settings.yml:

development:
    hello: <%= 1 + 2 %>

讀取出來的 $settings[:hello] 就會是 3

如果你不是在 config/application.rb 下面操作也沒關係,也可以用以下的方式召喚:

$settings = Rails::Application.config_for(:settings)

不過我自己是沒有這麼喜歡用全域變數,都會註冊進 config 就是了 XDDD


#3

okay,感恩,單純習慣自幹慣了|||

另外一方面我都寫 lib 比較多,且該 lib 可能會和 Rails 脫鉤(類似移到自幹的 bot 內,純 Ruby 環境),所以後來全都寫成全域變數惹 …


#4

寫 lib 就更不能用全域變數污染環境啦wwww

應該要用 module 跟 class variable 來存放管理這些變數


#5

沒,因為沒有 “Rails” 且 lib 內除 global var 完全不相依,不過事實上 lib 的變數都是 flow 內給的,而 flow 內會用到 global var 而已,對我而言用 module 只是把 global var 多包一層而已(然後限制只有一個,也就是 name),因為 module 本身就是 global var

否則這邊所提到的變數,應該都要用 module / class 包裝才行

https://ruby-doc.org/stdlib-2.0.0/libdoc/English/rdoc/English.html