2011-01-25 39 views
16

Tôi đang cố tạo một ứng dụng đường ray gán một giá trị cho một biến khi môi trường là môi trường phát triển và một giá trị khác cho cùng biến đó khi môi trường là môi trường sản xuất. Tôi muốn chỉ định cả hai giá trị trong mã của tôi (hardwired) và có đường ray biết giá trị nào được gán cho biến dựa trên môi trường nào đang chạy. Làm thế nào để tôi làm điều này?Rails 3/Thiết lập biến môi trường tùy chỉnh

Trong trường hợp quan trọng, sau này tôi truy cập biến đó và trả về giá trị của nó trong một phương thức lớp của một mô hình.

Trả lời

25

Bạn có thể thực hiện việc này bằng công cụ khởi tạo.

# config/initializers/configuration.rb 
class Configuration 
    class << self 
    attr_accessor :json_url 
    end 
end 

# config/environments/development.rb 
# Put this inside the ______::Application.configure do block 
config.after_initialize do 
    Configuration.json_url = 'http://test.domain.com' 
end 

# config/environments/production.rb 
# Put this inside the ______::Application.configure do block 
config.after_initialize do 
    Configuration.json_url = 'http://www.domain.com' 
end 

Sau đó, trong ứng dụng của bạn, hãy gọi biến Configuration.json_url

# app/controller/listings_controller.rb 
def grab_json 
    json_path = "#{Configuration.json_url}/path/to/json" 
end 

Khi bạn đang chạy trong chế độ phát triển, điều này sẽ nhấn URL http://test.domain.com.

Khi bạn đang chạy ở chế độ sản xuất, điều này sẽ đạt đến URL http://www.domain.com.

+1

Bất kỳ cơ hội nào bị hỏng trong 3.1? Làm việc như một say mê trong ứng dụng 3.0 của tôi, bây giờ nhận được NoMethodError (phương thức không xác định 'test_conf' cho ActiveSupport :: Cấu hình :: Cấu hình: Lớp): –

+0

# config/application.rb ứng dụng lớp lnguyen55

+8

Có một cách tốt hơn để làm điều này với Rails 3+. Bạn có thể sử dụng cấu hình hiện có để tạo config.json_url = '...' Tôi đã giải thích thêm về http://jasonnoble.org/2011/12/updated-rails3-custom-environment-variables.html –

-2

Bạn có thể tìm hiểu môi trường như thế này:

ruby-1.9.2-p0 > Rails.env 
    => "development" 

Store giá trị trong một biến toàn cầu trong config/application.rb của bạn ví dụ:

$foo = "something" 

Bạn cũng có thể gán các biến trong config/environments/ tập tin của bạn thay vì quyết định dựa trên ond Rails.env trong application.rb. Phụ thuộc vào hoàn cảnh của bạn.

3

tôi sử dụng Yettings gem trong Rails 3.2, cho phép tôi để lưu trữ các biến ứng dụng của tôi trong config/yettings.yml như vậy:

defaults: &defaults 
    api_key: asdf12345lkj 
    some_number: 999 
    an_erb_yetting: <%= "erb stuff works" %> 
    some_array: 
    - element1 
    - element2 

development: 
    <<: *defaults 
    api_key: api key for dev 

test: 
    <<: *defaults 

production: 
    <<: *defaults 

Và truy cập chúng như thế này:

#/your_rails_app/config/yetting.yml in production 
Yetting.some_number #=> 999 
Yetting.api_key #=> "asdf12345lkj" 
15

Tôi muốn lưu trữ các thiết lập trong YAML. Để có các cài đặt khác nhau dựa trên môi trường, với giá trị mặc định, bạn có thể có một tập tin khởi tạo (nói config/initializers/application_config.rb) như thế này:

APP_CONFIG = YAML.load_file("#{Rails.root}/config/application_config.yml")[Rails.env] 

... và sau đó trong config/application_config.yml:

defaults: &defaults 
    my_setting: "foobar" 

development: 
    # add stuff here to override defaults. 
    <<: *defaults 

test: 
    <<: *defaults 

production: 
    # add stuff here to override defaults. 
    <<: *defaults 

... sau đó, kéo ra cài đặt với APP_CONFIG[:my_setting]

+2

Làm thế nào bạn có thể sử dụng "APP_CONFIG" trong mã? Tôi nhận được một lỗi: uninitialized liên tục MyController :: APP_CONFIG – Jojje

+0

@Jojje, khởi động lại ứng dụng. Xem railscast chuyên dụng nếu bạn có thêm bất kỳ câu hỏi nào http://railscasts.com/episodes/85-yaml-configuration-file. Các phím biểu tượng cũng không hoạt động đối với tôi. 'APP_CONFIG ['my_setting']' - đây là cách bạn đọc cài đặt. – jibiel

+1

Tôi cần cấu hình này trong các trình khởi tạo khác, vì vậy tôi đã sử dụng dòng 'YAML.load_file (...)' trong 'config/environment.rb', ngay trước dòng' Application.initialize! '. (thông qua [Tyler Long] (http://stackoverflow.com/a/11054390/361609)) – colllin

Các vấn đề liên quan