2014-10-20 2 views
2

Сейчас у меня есть простое приложение Sinatra, которое подключается к БД.Получение конфигурации БД из запроса

Прямо сейчас у меня есть строки подключения, жестко закодированные внутри самого репо. Моя цель - вернуть информацию о соединении из другого файла (который в конечном итоге будет находиться вне репо).

Это то, что я пытался до сих пор:

app.rb

class MySinatraApp < Sinatra::Application 

    configure do 

    conf = require_relative 'configuration' 

    # set public dirs, sessions, etc. 

    set :mongourl, conf[:mongourl] 
    set :mongodb, conf[:mongodb] 
    end 
end 

... И, наконец, в configuration.rb

env = ENV['RACK_ENV'].to_sym 

case env 
when :production 
    return { 
    "mongourl" => 'mongodb://localhost/prod', 
    "mongodb" => 'prod' 
    } 

when :development 
    return { 
    "mongourl" => 'mongodb://localhost/dev', 
    "mongodb" => 'prod' 
    } 

else 
    return { 
    "mongourl" => 'mongodb://localhost/test', 
    "mongodb" => 'test' 
    } 
end 

Идея будет просто вернуть то, что хэш Мне нужно использовать, однако, когда я пытаюсь выполнить вышеуказанное, он устраняет ошибки:

<my_project_dir>/configuration.rb: <my_project_dir>/configuration.rb:9: Invalid return (SyntaxError) 
<my_project_dir>/configuration.rb:16: Invalid return 
<my_project_dir>/configuration.rb:21: Invalid return 

Из-за ошибки вы не можете вернуть то, как я это делаю сейчас. Я предполагаю, что это происходит потому, что это не вызов какой-либо функции? Как обычно люди включают файлы конфигурации в Ruby/Sinatra?

ответ

2

Вы правы, что не можете сделать этого, потому что вы не можете return из файла require d таким образом (at least not at the moment). В вашем решении используется константа верхнего уровня, а не глобальная (глобальные переменные выглядят как $foo, константы выглядят как Foo или FOO), но это почти то же самое.

Общее решение для настройки в Sinatra, как это делается с ConfigFile from Sinatra-contrib.

Создайте конфигурационный YAML файл:

production: 
    mongourl: mongodb://localhost/prod 
    mongodb: prod 
develepment: 
    mongourl: mongodb://localhost/dev 
    mongodb: prod 
test: 
    mongourl: mongodb://localhost/test 
    mongodb: test 

Затем в Синатры файл (установить sinatra-contrib gem первый):

require 'sinatra' 
require 'sinatra/config_file' 

config_file 'path/to/config.yml' 

настройки из конфигурационного файла теперь будут доступны в соответствии с любой среда работает.

Другой способ сделать это - поместить все данные конфигурации в переменные окружения, а затем получить к ним доступ с помощью ENV. Это предотвращает случайную проверку учетных данных производителя для контроля версий, но это означает, что вам нужно каким-то образом управлять всеми конфигурационными варами.Посмотрите на dotenv или Foreman для инструментов, которые могут помочь с этим, если вы хотите пойти этим путем.

+0

Awesome, спасибо за рецензии! Мне пришлось немного поработать с приложением, чтобы заставить его работать, но это были больше мои собственные недостатки, чем ваши объяснения. Спасибо за помощь! –

0

Казалось бы, я могу просто объявить переменную в корне файла require, это автоматически глобально (я думаю). В любом случае, это то, как я изменил файлы для работы:

app.rb

class MySinatraApp < Sinatra::Application 

    configure do 

    require_relative 'configuration' 

    # set public dirs, sessions, etc. 

    set :mongourl, CONFIG["mongourl"] 
    set :mongodb, CONFIG["mongodb"] 
    end 
end 

configuration.rb

env = ENV['RACK_ENV'].to_sym 

case env 
when :production 
    CONFIG = { 
    "mongourl" => 'mongodb://localhost/prod', 
    "mongodb" => 'prod' 
    } 

when :development 
    CONFIG = { 
    "mongourl" => 'mongodb://localhost/dev', 
    "mongodb" => 'prod' 
    } 

else 
    CONFIG = { 
    "mongourl" => 'mongodb://localhost/test', 
    "mongodb" => 'test' 
    } 
end 

Не супер-большой поклонник наличия строк подключения находящихся в глобальной переменной, но сейчас это будет работать. Если у кого-то есть лучший способ включить строки подключения DB, пожалуйста, поделитесь!

1

Если у кого-то есть лучший способ включить строки подключения DB, пожалуйста, поделитесь!

Я не собираюсь говорить, что это лучший способ, но я делаю это так, потому что это просто. Более или менее это то же самое, что и файл synatra/config_file.

Так у вас есть файл конфигурации с различными значениями для каждой среды

$cat config.yaml 
development: 
    mongourl: mongodb://localhost/test 
    mongodb: dev 
production: 
    mongourl: mongodb://localhost/test 
    mongodb: prod 

А теперь просто использовать:

configure do 
    env = ENV['RACK_ENV'] 
    AppConfig = YAML.load_file(File.expand_path("../config.yaml", File.dirname(__FILE__)))[env] 
    set :mongourl, AppConfig['mongourl'] 
    set :mongodb, AppConfig['mongodb'] 
end 
Смежные вопросы