วิธีกำหนดตัวแปรการกำหนดค่าที่กำหนดเองในทางรถไฟ


337

ฉันสงสัยว่าจะเพิ่มตัวแปรการกำหนดค่าแบบกำหนดเองลงในแอปพลิเคชั่นทางรถไฟและวิธีการเข้าถึงตัวแปรเหล่านั้นในคอนโทรลเลอร์ได้อย่างไรเช่นฉันต้องการที่จะสามารถกำหนดคำสั่ง upload_directory ในไฟล์กำหนดค่าได้ว่า development.rb และสามารถเข้าถึงได้ในหนึ่ง ตัวควบคุม

ประการที่สองฉันวางแผนที่จะรองรับ S3 สำหรับการอัปโหลดในแอปพลิเคชันของฉันหากฉันต้องการเพิ่มไฟล์ yaml ที่มีการเข้าถึง s3, รหัสลับ, ฉันจะเริ่มต้นได้อย่างไรในแอป Rails ของฉันและฉันจะเข้าถึงค่าที่ฉันกำหนดไว้อย่างไร ในไฟล์ปรับแต่งนั้น



มีความเกี่ยวข้องเล็กน้อย: อย่าลืมรีสตาร์ทเซิร์ฟเวอร์เมื่อเพิ่มตัวแปรการกำหนดค่าใหม่
ดาเมียนÓ Ceallaigh

คำตอบ:


165

อัปเดต 1

แนะนำมาก: ฉันไปกับRails Config gem ทุกวันนี้เพื่อการควบคุมที่ดี

Update2

หากคุณต้องการวิธีแก้ปัญหาอย่างรวดเร็วให้ตรวจสอบคำตอบของ Jack Prattด้านล่าง

แม้ว่าคำตอบดั้งเดิมของฉันด้านล่างยังใช้ได้ แต่คำตอบนี้ล้าสมัยแล้ว ฉันแนะนำให้ดูที่การปรับปรุง 1 และ 2

คำตอบเดิม:

สำหรับวิธีแก้ปัญหาอย่างรวดเร็วการดูหน้าจอ "ไฟล์การกำหนดค่า YAML" ที่นำเสนอโดย Ryan Bates น่าจะมีประโยชน์มาก

สรุป:

# 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

62
คำตอบนี้ล้าสมัย ดูstackoverflow.com/questions/1450285/…ด้านล่าง
mattwynne

8
@matt: มันล้าสมัยเพราะ Rails 3 เปิดตัวหรือเพราะตอนนี้ทุกคนอยู่ใน Rails 3 หรือ ... ?
Lasse V. Karlsen

ขอบคุณที่ชี้ให้เห็นถึงความล้าสมัย ฉันเกลียดที่เกี่ยวกับ Rails - รหัสจาก 1 ปีที่ผ่านมาเก่าเกินไป
jcollum

2
สำหรับคนที่ต้องการใช้วิธีการ YAML ใน Rails 3+ คุณจะต้องเปลี่ยนRAILS_ENVด้วยRails.envและมีRAILS_ROOT Rails.root
Ryan

ฉันลอง rails_config ในเอกสารพวกเขาแนะนำให้ฉันลงทะเบียน RailsConfig ใน app.rb ของฉัน ฉันถือว่า app.rb = config / application.rb แต่ใน application.rb ฉันควรจะใส่บรรทัด RailsConfig register หรือไม่?
NhímHổBáo

375

ใน Rails 3 ข้อมูลการกำหนดค่าที่กำหนดเองเฉพาะแอปพลิเคชันสามารถวางไว้ในวัตถุการกำหนดค่าแอปพลิเคชัน การกำหนดค่าสามารถกำหนดได้ในไฟล์เริ่มต้นหรือไฟล์สภาพแวดล้อม - กล่าวสำหรับแอปพลิเคชันที่กำหนดMyApp:

MyApp::Application.config.custom_config_variable = :my_config_setting

หรือ

Rails.configuration.custom_config_variable = :my_config_setting

หากต้องการอ่านการตั้งค่าเพียงเรียกตัวแปรการกำหนดค่าโดยไม่ต้องตั้งค่า:

Rails.configuration.custom_config_variable
=> :my_config_setting

อัพเดท Rails 4

ใน Rails 4 มีวิธีใหม่สำหรับการ = นี้http://guides.rubyonrails.org/configuring.html#custom-configuration

ป้อนคำอธิบายรูปภาพที่นี่


11
มันใช้งานได้สำหรับฉัน ฉันกำหนดการตั้งค่าเฉพาะสภาพแวดล้อมของฉันใน environment / {environment} .rb เช่น environment / development.rb ตรวจสอบให้แน่ใจว่าคุณรีสตาร์ทเซิร์ฟเวอร์หลังจากแก้ไข อาจมีเทคนิคที่สวยงามกว่านี้ แต่ฉันอัปเกรดแอพที่มีอยู่ซึ่งเคยใช้ ENV ['XXX'] ในไฟล์เดียวกันและเนื่องจากฉันต้องการ จำกัด จำนวนการปรับสภาพใหม่ในระหว่างการอัปเกรด
pduey

13
นี่คือการมอบหมาย แต่คุณจะเข้าถึงค่านี้ได้อย่างไร?
kevzettler

9
ถ้าคุณดูใน application.rb ของแอพพลิเคชั่น 3.x rails มันเป็น "การกำหนดค่าแอปพลิเคชันควรเข้าไปในไฟล์ใน config / initializers" ตามคำตอบนี้ มีเอกสารมากมายเกี่ยวกับวิธีการเข้าถึงตัวแปร ( edgeguides.rubyonrails.org/configuring.html ) เช่นในไฟล์ชื่อ some_variables.rb ในโฟลเดอร์ initializers วางตัวแปรตามที่อธิบายไว้ข้างต้น (แทนที่ MyApp ด้วยชื่อแอปของคุณ) จากนั้นเมื่อคุณต้องการใช้งานเพียงแค่เรียก config.custom_config_variable แน่นอนคุณสามารถใช้ชื่อตัวแปรใดก็ได้ที่คุณต้องการ . @Jack Pratt คุณสามารถแก้ไขคำตอบที่สมบูรณ์กว่านี้ได้หรือไม่
jamesc

48
เพื่อนง่าย ๆ : เส้นทาง: กำหนดค่า config/environments/production.rb : config.whatever = false เข้าถึงได้ทุกที่: Rails.configuration.whatever
Victor S

5
undefined methodระวังว่าถ้าคุณตั้งค่าบางสิ่งบางอย่างเท่านั้นในการผลิตและพยายามที่จะเข้าถึงได้ในสภาพแวดล้อมอื่นก็จะบ่น
lulalala

69

ใน Rails 3.0.5 วิธีการต่อไปนี้ใช้ได้สำหรับฉัน:

ในconfig/environments/development.rbเขียน

config.custom_config_key = :config_value

ค่าcustom_config_keyนั้นสามารถอ้างอิงได้จากไฟล์อื่นโดยใช้

Rails.application.config.custom_config_key

4
undefined methodระวังว่าถ้าคุณตั้งค่าบางสิ่งบางอย่างเท่านั้นในการผลิตและพยายามที่จะเข้าถึงได้ในสภาพแวดล้อมอื่นก็จะบ่น
lulalala

ฉันลองสิ่งนี้ใน Rails 4.1 และฉันได้รับข้อผิดพลาด "... method_missing': undefined method store 'สำหรับ # <Rails :: Application :: Configuration: 0x007f9f735b7240> ... " ฉันพยายามเพิ่มตัวแปร "config.store.works"
Spundun

1
@Spundun คุณได้รับข้อผิดพลาดที่เพราะทางรถไฟไม่ทราบว่าstoreเป็น เพื่อที่จะใช้วิธีการในคำตอบนี้คุณสามารถเปลี่ยนชื่อตัวแปรของคุณstore_worksหรือสร้างconfig.storeบล็อกที่worksกำหนดไว้ในนั้น
Paul Pettengill

ขอบคุณฉันในที่สุดคิดออกว่า นั่นคือซ้อนแฮชดังนั้นฉันต้องเริ่มต้นแฮชว่างซ้ำถ้าฉันจะใช้จุดในชื่อ config ของฉัน
Spundun

31

ใช้งานได้กับราง 3.1:

ใน config / environment.rb (หรือใน config / environment / .. เพื่อกำหนดเป้าหมายสภาพแวดล้อมเฉพาะ):

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

สิ่งนี้จะสามารถเข้าถึงได้ในตัวควบคุมหรือมุมมองเช่นนี้:

YourApp::Application.config.yourKey

(YourApp ควรถูกแทนที่ด้วยชื่อแอปพลิเคชันของคุณ)

บันทึก : มันเป็นรหัส Ruby ดังนั้นหากคุณมีคีย์การตั้งค่ามากมายคุณสามารถทำได้:

ใน config / environment.rb:

YourApp::Application.configure do
  config.something = foo
  config.....
  config....
  .
  config....
end

2
camelCase: o ใช้ snake_case!
siegy22

30

ใน Rails 4

สมมติว่าคุณใส่ตัวแปรที่กำหนดเองลงในไฟล์ yaml:

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

สร้าง initializer เพื่อโหลด:

# 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

ตอนนี้ที่ใดก็ได้ในแอปของคุณคุณสามารถเข้าถึงค่าเหล่านี้ได้ดังนี้

Rails.configuration.acme.api_user

มันสะดวกที่Rails.application.config_for :acmeจะโหลดของคุณacme.ymlและใช้สภาพแวดล้อมที่ถูกต้อง


21

เนื่องจาก Rails 4.2 ไม่มีอัญมณีเพิ่มเติมคุณสามารถโหลดconfig / hi.yml ได้ง่ายๆโดยการใช้Rails.application.config_for :hiง่ายๆโดยการใช้

ตัวอย่างเช่น:

  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. และตอนนี้คุณสามารถใช้ AUTHENTICATIONค่าคงที่ทุกที่ในแอปพลิเคชันของคุณ:

    #rails c production
    :001> AUTHENTICATION['username'] => 'aa'
  2. จากนั้นเพิ่มpassword.ymlไปที่. gitignore : echo /config/passwords.yml >> .gitignoreสร้างไฟล์ตัวอย่างเพื่อความสะดวกสบายของคุณcp /config/passwords.yml /config/passwords.example.ymlและจากนั้นเพียงแค่แก้ไขไฟล์ตัวอย่างของคุณในคอนโซลการผลิตด้วยค่าการผลิตจริง


13

ฉันแค่อยากจะอัปเดตสิ่งนี้สำหรับสิ่งดีๆล่าสุดใน Rails 4.2 ตอนนี้คุณสามารถทำได้ภายในconfig/**/*.rbไฟล์ใด ๆ ของคุณ:

config.x.whatever.you.want = 42

... และสิ่งนี้จะมีอยู่ในแอปของคุณใน:

Rails.configuration.x.whatever.you.want

ดูเพิ่มเติมได้ที่นี่: http://guides.rubyonrails.org/configuring.html#custom-configuration


8

ลองดูอัญมณีที่ประณีตนี้ว่า: https://github.com/mislav/choices

วิธีนี้ข้อมูลที่ละเอียดอ่อนของคุณจะไม่ถูกเปิดเผยในโครงการโอเพ่นซอร์ส


4

ฉันสร้างปลั๊กอินง่ายๆสำหรับการตั้งค่า YAML: ปักหมุด

มันทำงานคล้ายกับรหัสในคำตอบของ khelll แต่คุณจะต้องเพิ่มไฟล์การตั้งค่า YAML นี้:

app/config/yetting.yml

ปลั๊กอินสร้างคลาสแบบไดนามิกที่ช่วยให้คุณเข้าถึงการตั้งค่า YML เป็นวิธีการเรียนในแอพของคุณเช่น:

Yetting.your_setting

นอกจากนี้หากคุณต้องการใช้ไฟล์การตั้งค่าหลายไฟล์ที่มีชื่อเฉพาะคุณสามารถวางไว้ในไดเรกทอรีย่อยภายใน app / config ดังนี้:

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

จากนั้นคุณสามารถเข้าถึงค่าเช่นนี้:

FirstYetting.your_setting
SecondYetting.your_setting

นอกจากนี้ยังให้การตั้งค่าเริ่มต้นที่สามารถแทนที่ได้ต่อสภาพแวดล้อม คุณยังสามารถใช้ erb ในไฟล์ yml


ตอนนี้ repo อย่างเป็นทางการอยู่ที่: github.com/charlotte-ruby/yettings (ดังนั้นผู้ตรวจสอบปฏิเสธการแก้ไขของฉันโดยบอกว่ามันน้อยเกินไป)
lulalala

4

ฉันชอบอัญมณีการตั้งค่า ติดตั้งและใช้งานง่ายมาก

https://github.com/binarylogic/settingslogic


2
รักเท่านี้ วางวัตถุการตั้งค่าของคุณที่ app / models / settings.rb ทำให้คุณโหลดซ้ำในโหมด dev ได้เช่นกัน ชนะ!
Mat Schaffer

4

ถ้าคุณใช้ Heroku หรือมิฉะนั้นมีความต้องการที่จะให้การตั้งค่าโปรแกรมของคุณเป็นตัวแปรสภาพแวดล้อมที่Figaroอัญมณีที่เป็นประโยชน์มาก


2

ฉันชอบที่จะใช้การตั้งค่าทางรถไฟสำหรับค่าการกำหนดค่าทั่วโลกที่ต้องเปลี่ยนผ่านเว็บอินเตอร์เฟส


2
ฉันต้องการใช้ปลั๊กอินเพิ่มเติม ฯลฯ เนื่องจากฉันกำลังเรียนรู้รางดังนั้นวิธีที่ดีที่สุดที่จะทำคือไม่มีปลั๊กอิน
ชีฟ

หมายเหตุนี่ใช้ฐานข้อมูลเพื่อจัดเก็บการกำหนดค่าซึ่งอาจหนักเกินไปสำหรับบางคน
lulalala

0

สิ่งที่เราเริ่มทำในที่ทำงานคือแฮชของActiveSupport

ซึ่งช่วยให้คุณกำหนดการตั้งค่าของคุณอย่างสะอาดภายในไฟล์สภาพแวดล้อมเช่น

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

-5

ฉันขอแนะนำวิธีการที่ดีในการจัดการกับการกำหนดค่าในแอปพลิเคชันของคุณเลย มีกฎพื้นฐานสามข้อ:

  • เปลี่ยนการกำหนดค่าของคุณไม่ใช่รหัส
  • ใช้การกำหนดค่าผ่านเงื่อนไข
  • เขียนโค้ดที่มีความหมายบางอย่าง

หากต้องการภาพรวมโดยละเอียดเพิ่มเติมไปที่ลิงค์นี้: การตั้งค่าทางรถไฟในวิธีที่เหมาะสม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.