Cara mendefinisikan variabel konfigurasi khusus di rel

337

Saya bertanya-tanya bagaimana cara menambahkan variabel konfigurasi khusus ke aplikasi rel dan bagaimana mengaksesnya di controller, untuk misalnya saya ingin dapat mendefinisikan upload_directory dalam file konfigurasi mengatakan development.rb dan dapat mengaksesnya di salah satu dari saya pengendali.

Kedua saya berencana untuk memiliki dukungan S3 untuk unggahan dalam aplikasi saya, jika saya ingin menambahkan file yaml dengan akses s3, kunci rahasia, bagaimana cara menginisialisasi dalam Aplikasi Rails saya dan bagaimana cara mengakses nilai yang telah saya tetapkan dalam file konfigurasi itu.

Pisau
sumber
1
Duplikat: stackoverflow.com/questions/592554/…
John Topley
Terkait sedikit: Jangan lupa me-restart server saat menambahkan variabel konfigurasi baru.
Damien Ó Ceallaigh

Jawaban:

165

Perbarui 1

Sangat direkomendasikan: Saya akan menggunakan Rails Config gem saat ini untuk kontrol berbutainya

Pembaruan2

Jika Anda menginginkan solusi cepat, maka periksa jawaban Jack Pratt di bawah ini.

Meskipun jawaban asli saya di bawah masih berfungsi, jawaban ini sekarang sudah usang. Saya sarankan melihat pembaruan 1 dan 2.

Jawaban asli:

Untuk solusi cepat, menonton layar "File Konfigurasi YAML" yang dibuat oleh Ryan Bates akan sangat membantu.

Singkatnya:

# 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
khelll
sumber
62
Jawaban ini kedaluwarsa. Lihat stackoverflow.com/questions/1450285/… di bawah ini
mattwynne
8
@ Matt: Apakah sudah usang karena Rails 3 telah dirilis, atau karena semua orang sekarang di Rails 3, atau ...?
Lasse V. Karlsen
Terima kasih telah menunjukkan yang sudah usang. Saya benci itu tentang Rails - kode dari 1 tahun yang lalu terlalu tua.
jcollum
2
Bagi siapa pun yang ingin menggunakan metode YAML di Rails 3+, Anda harus mengganti RAILS_ENVdengan Rails.envdan RAILS_ROOTdengan Rails.root.
Ryan
Saya mencoba rails_config. Dalam dokumentasi mereka menginstruksikan saya untuk mendaftarkan RailsConfig di app.rb. Saya menganggap app.rb = config / application.rb itu. Tapi di mana di application.rb saya harus meletakkan garis register RailsConfig?
Nhím Hổ Báo
375

Dalam Rails 3, data konfigurasi khusus aplikasi dapat ditempatkan di objek konfigurasi aplikasi. Konfigurasi dapat ditetapkan dalam file inisialisasi atau file lingkungan - katakan untuk aplikasi yang diberikan MyApp:

MyApp::Application.config.custom_config_variable = :my_config_setting

atau

Rails.configuration.custom_config_variable = :my_config_setting

Untuk membaca pengaturan, cukup panggil variabel konfigurasi tanpa menyetelnya:

Rails.configuration.custom_config_variable
=> :my_config_setting

MEMPERBARUI Rel 4

Di Rails 4 ada cara baru untuk ini => http://guides.rubyonrails.org/configuring.html#custom-configuration

masukkan deskripsi gambar di sini

Jack Pratt
sumber
11
Ini bekerja untuk saya. Saya menempatkan pengaturan konfigurasi khusus lingkungan saya di environment / {environment} .rb, misal, environment / development.rb. Pastikan Anda me-restart server Anda setelah memodifikasi. Mungkin ada teknik yang lebih elegan, tapi saya memperbarui aplikasi yang sudah ada yang sebelumnya menggunakan ENV ['XXX'] dalam file yang sama, dan karena saya ingin membatasi jumlah refactoring selama upgrade, ini berhasil dengan baik.
pduey
13
Ini adalah tugas tetapi bagaimana Anda mengakses nilai ini?
kevzettler
9
Jika Anda melihat di application.rb dari aplikasi rel 3.x itu mengatakan "Konfigurasi aplikasi harus masuk ke file dalam konfigurasi / inisialisasi" sesuai jawaban ini. Ada banyak dokumentasi tentang cara mengakses variabel ( edgeguides.rubyonrails.org/configuring.html ). misalnya dalam file bernama some_variables.rb di folder initializers tempat variabel seperti dijelaskan di atas (mengganti MyApp dengan nama aplikasi Anda) maka ketika Anda ingin menggunakannya cukup panggil config.custom_config_variable Anda tentu saja dapat menggunakan nama variabel apa pun yang Anda suka . @ Jack Pratt Anda dapat mengedit jawaban yang lebih lengkap?
jamesc
48
Bung, sederhana: Path: config/environments/production.rb Config: config.whatever = false Akses di mana saja: Rails.configuration.whatever
Victor S
5
Berhati-hatilah bahwa jika Anda menetapkan sesuatu hanya dalam produksi, dan mencoba mengaksesnya di lingkungan lain, itu akan mengeluh undefined method.
lulalala
69

Di Rails 3.0.5, pendekatan berikut ini bekerja untuk saya:

Di config/environments/development.rb, tulis

config.custom_config_key = :config_value

Nilai custom_config_keytersebut kemudian dapat dirujuk dari file lain menggunakan

Rails.application.config.custom_config_key
Rob Dawson
sumber
4
Berhati-hatilah bahwa jika Anda menetapkan sesuatu hanya dalam produksi, dan mencoba mengaksesnya di lingkungan lain, itu akan mengeluh undefined method.
lulalala
Saya sudah mencoba ini pada rails 4.1 dan saya mendapatkan error, "... method_missing': undefined method store 'for # <Rails :: Application :: Configuration: 0x007f9f735772b7240> ...". Saya mencoba menambahkan variabel config "config.store.works".
Spundun
1
@Spundun Anda mendapatkan kesalahan itu, karena Rails tidak tahu apa storeitu. Untuk menggunakan metode dalam jawaban ini, Anda dapat mengubah nama variabel Anda store_works, atau membuat config.storeblok dengan worksdidefinisikan di dalamnya.
Paul Pettengill
Terima kasih, saya akhirnya menemukan jawabannya. Bahwa ini adalah hash bersarang jadi saya harus menginisialisasi hash kosong secara rekursif jika saya menggunakan titik-titik dalam nama konfigurasi saya.
Spundun
31

Ini bekerja di rel 3.1:

di config / environment.rb (atau di config / environment / .. untuk menargetkan lingkungan tertentu):

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

Ini akan dapat diakses di controller atau tampilan seperti ini:

YourApp::Application.config.yourKey

(YourApp harus diganti dengan nama aplikasi Anda.)

Catatan : Ini kode Ruby, jadi jika Anda memiliki banyak kunci konfigurasi, Anda dapat melakukan ini:

di config / environment.rb:

YourApp::Application.configure do
  config.something = foo
  config.....
  config....
  .
  config....
end
Alain Beauvois
sumber
2
camelCase: o gunakan snake_case!
siegy22
30

Dalam Rails 4

Dengan asumsi Anda menempatkan variabel khusus Anda ke file yaml:

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

Buat penginisialisasi untuk memuatnya:

# 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

Sekarang di mana saja di aplikasi Anda, Anda dapat mengakses nilai-nilai ini seperti:

Rails.configuration.acme.api_user

Lebih mudah Rails.application.config_for :acmeuntuk memuat Anda acme.ymldan menggunakan lingkungan yang benar.

pymkin
sumber
21

Karena Rails 4.2, tanpa permata tambahan, Anda dapat memuat config / hi.yml hanya dengan menggunakan Rails.application.config_for :hi.

Sebagai contoh:

  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. dan sekarang Anda dapat menggunakan AUTHENTICATIONkonstanta di mana saja di aplikasi Anda:

    #rails c production
    :001> AUTHENTICATION['username'] => 'aa'
  2. kemudian tambahkan passwords.yml ke Gitignore : echo /config/passwords.yml >> .gitignore, membuat contoh file untuk kenyamanan Anda cp /config/passwords.yml /config/passwords.example.ymldan kemudian hanya mengedit file contoh Anda di konsol produksi Anda dengan nilai-nilai produksi yang sebenarnya.

danau
sumber
13

Saya hanya ingin memperbarui ini untuk hal-hal keren terbaru di Rails 4.2, sekarang Anda dapat melakukan ini di dalam salah satu config/**/*.rbfile Anda :

config.x.whatever.you.want = 42

... dan ini akan tersedia di aplikasi Anda sebagai:

Rails.configuration.x.whatever.you.want

Lihat lebih lanjut di sini: http://guides.rubyonrails.org/configuring.html#custom-configuration

kotor
sumber
8

Lihat permata rapi ini melakukan hal itu: https://github.com/mislav/choices

Dengan cara ini data sensitif Anda tidak akan diekspos dalam proyek sumber terbuka

Flov
sumber
4

Saya membuat plugin sederhana untuk pengaturan YAML: Yettings

Ini bekerja dengan cara yang mirip dengan kode dalam jawaban khelll, tetapi Anda hanya perlu menambahkan file konfigurasi YAML ini:

app/config/yetting.yml

Plugin secara dinamis membuat kelas yang memungkinkan Anda untuk mengakses pengaturan YML sebagai metode kelas di aplikasi Anda seperti:

Yetting.your_setting

Juga, jika Anda ingin menggunakan beberapa file pengaturan dengan nama unik, Anda dapat menempatkannya di subdirektori di dalam aplikasi / config seperti ini:

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

Kemudian Anda dapat mengakses nilai-nilai seperti ini:

FirstYetting.your_setting
SecondYetting.your_setting

Ini juga memberi Anda pengaturan default yang dapat diganti per lingkungan. Anda juga dapat menggunakan erb di dalam file yml.

johnmcaliley
sumber
Repo resmi sekarang di: github.com/charlotte-ruby/yettings (SO resensi menolak suntingan saya mengatakan itu terlalu kecil)
lulalala
4

Saya sangat suka permata pengaturanlogic . Sangat mudah diatur dan digunakan.

https://github.com/binarylogic/settingslogic

Rahil Sondhi
sumber
2
Mencintai ini sejauh ini. Menempatkan objek pengaturan Anda di app / models / settings.rb membuat Anda memuat ulang dalam mode dev juga. Menang!
Mat Schaffer
4

Jika Anda menggunakan Heroku atau perlu mempertahankan pengaturan aplikasi Anda sebagai variabel lingkungan, figaro gem sangat membantu.

MikeH
sumber
2

Saya suka menggunakan rel-pengaturan untuk nilai konfigurasi global yang perlu diubah melalui antarmuka web.

mengutip
sumber
2
Saya tidak ingin menggunakan plugin tambahan dll, karena saya belajar rails, jadi cara terbaik untuk melakukannya adalah tanpa plugin.
Shiv
Perhatikan ini menggunakan database untuk menyimpan konfigurasi, yang mungkin terlalu berat bagi sebagian orang.
lulalala
0

Sesuatu yang kami mulai lakukan di tempat kerja adalah ActiveSupport Ordered Hash

Yang memungkinkan Anda untuk mendefinisikan konfigurasi Anda dengan bersih di dalam file lingkungan mis

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

Saya akan menyarankan pendekatan yang baik bagaimana menangani konfigurasi di aplikasi Anda sama sekali. Ada tiga aturan dasar:

  • ubah konfigurasi Anda bukan kode;
  • menggunakan konfigurasi di atas kondisi;
  • tulis kode yang berarti sesuatu.

Untuk mendapatkan gambaran umum yang lebih rinci, ikuti tautan ini: Konfigurasi rel dengan cara yang benar

paladiy
sumber