Como definir variáveis ​​de configuração personalizadas nos trilhos


337

Eu queria saber como adicionar variáveis ​​de configuração personalizadas a um aplicativo rails e como acessá-las no controlador, por exemplo, eu quero definir um diretório de upload nos arquivos de configuração, como development.rb e acessá-lo em um dos meus controladores.

Em segundo lugar, eu estava planejando ter suporte ao S3 para uploads no meu aplicativo, se eu quisesse adicionar um arquivo yaml com o acesso s3, chave secreta, como inicializá-lo no meu aplicativo Rails e como acesso os valores que defini nesse arquivo de configuração.



Ligeiramente relacionado: não se esqueça de reiniciar o servidor ao adicionar novas variáveis ​​de configuração.
Damien Ó Ceallaigh

Respostas:


165

Atualização 1

Muito recomendado: hoje em dia, uso a gema Rails Config para obter o controle refinado que ela fornece.

Update2

Se você deseja uma solução rápida, verifique a resposta de Jack Pratt abaixo.

Embora minha resposta original abaixo ainda funcione, esta resposta está desatualizada. Eu recomendo olhar para as atualizações 1 e 2.

Resposta original:

Para uma solução rápida, assistir à tela "Arquivo de configuração YAML" de Ryan Bates deve ser muito útil.

Em suma:

# 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
Esta resposta está desatualizada. Veja stackoverflow.com/questions/1450285/… abaixo
mattwynne

8
@matt: Está desatualizado porque o Rails 3 foi lançado ou porque todo mundo está agora no Rails 3 ou ...?
Lasse V. Karlsen

Obrigado por apontar o desatualizado. Eu odeio isso no Rails - o código de 1 ano atrás é muito antigo.
Jcollum

2
Para quem quiser usar o método YAML no Rails 3+, será necessário substituir RAILS_ENVpor Rails.enve RAILS_ROOTpor Rails.root.
21712 Ryan

Eu tentei rails_config. Na documentação, eles me instruem a registrar o RailsConfig no meu app.rb. Presumo que app.rb = config / application.rb. Mas onde no application.rb devo colocar a linha de registro RailsConfig?
Nhim Ho Bao

375

No Rails 3, os dados de configuração personalizados específicos do aplicativo podem ser colocados no objeto de configuração do aplicativo. A configuração pode ser atribuída nos arquivos de inicialização ou nos arquivos de ambiente - digamos, para um determinado aplicativo MyApp:

MyApp::Application.config.custom_config_variable = :my_config_setting

ou

Rails.configuration.custom_config_variable = :my_config_setting

Para ler a configuração, basta chamar a variável de configuração sem defini-la:

Rails.configuration.custom_config_variable
=> :my_config_setting

UPDATE Rails 4

No Rails 4, existe uma nova maneira de isso => http://guides.rubyonrails.org/configuring.html#custom-configuration

insira a descrição da imagem aqui


11
Funciona para mim. Coloquei as definições de configuração específicas do meu ambiente em environment / {environment} .rb, por exemplo, environment / development.rb. Certifique-se de reiniciar o servidor após a modificação. Pode haver técnicas mais elegantes, mas estou atualizando um aplicativo existente que anteriormente usava ENV ['XXX'] no mesmo arquivo e, como quero limitar a quantidade de refatoração durante a atualização, isso funcionou bem.
Pduey

13
Isso é atribuição, mas como você acessa esse valor?
kevzettler

9
Se você procurar no application.rb de um aplicativo Rails 3.x, ele diz "A configuração do aplicativo deve entrar em arquivos em config / initializers", conforme esta resposta. Há muita documentação sobre como acessar a variável ( edgeguides.rubyonrails.org/configuring.html ). por exemplo, em um arquivo chamado some_variables.rb, na pasta inicializadores, coloque a variável conforme descrito acima (substituindo MyApp pelo nome do seu aplicativo) e, quando você quiser usá-lo, basta chamar config.custom_config_variable. É claro que você pode usar qualquer nome de variável que desejar . @Jack Pratt, você poderia editar uma resposta mais completa?
jamesc

48
Cara, simples: Caminho: config/environments/production.rb Config: config.whatever = false acesse em qualquer lugar: Rails.configuration.whatever
Victor S

5
Cuidado, se você definir algo somente na produção e tentar acessá-lo em outro ambiente, ele reclamará undefined method.
Lulalala 15/03/12

69

No Rails 3.0.5, a seguinte abordagem funcionou para mim:

Em config/environments/development.rb, write

config.custom_config_key = :config_value

O valor custom_config_keypode ser referenciado a partir de outros arquivos usando

Rails.application.config.custom_config_key

4
Cuidado, se você definir algo somente na produção e tentar acessá-lo em outro ambiente, ele reclamará undefined method.
Lulalala 15/03/12

Tentei isso no Rails 4.1 e estou recebendo erros, "... method_missing': undefined method store" para # <Rails :: Application :: Configuration: 0x007f9f735b7240> ... ". Eu estava tentando adicionar a variável de configuração "config.store.works".
Spundun 19/03/2014

11
@ Spundun Você está recebendo esse erro, porque o Rails não sabe o que storeé. Para usar o método nesta resposta, você pode renomear sua variável store_worksou criar um config.storebloco com as worksdefinições definidas.
Paul Pettengill

Obrigado, eu finalmente descobri isso. Como esses são hashes aninhados, é necessário inicializar hashes vazios recursivamente para usar pontos nos meus nomes de configuração.
Spundun

31

Isso funciona nos trilhos 3.1:

em config / environment.rb (ou em config / environment / .. para direcionar um ambiente específico):

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

Isso estará acessível no controlador ou em visualizações como esta:

YourApp::Application.config.yourKey

(YourApp deve ser substituído pelo nome do seu aplicativo.)

Nota : É código Ruby, portanto, se você tiver muitas chaves de configuração, poderá fazer o seguinte:

em config / environment.rb:

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

2
camelCase: o use snake_case!
precisa saber é o seguinte

30

No Rails 4

Supondo que você coloque suas variáveis ​​personalizadas em um arquivo yaml:

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

Crie um inicializador para carregá-los:

# 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

Agora, em qualquer lugar do seu aplicativo, você pode acessar esses valores da seguinte forma:

Rails.configuration.acme.api_user

É conveniente Rails.application.config_for :acmecarregar o seu acme.ymle usar o ambiente correto.


21

Desde o Rails 4.2, sem gemas adicionais, você pode carregar o config / hi.yml simplesmente usandoRails.application.config_for :hi .

Por exemplo:

  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. e agora você pode usar AUTHENTICATIONconstante em qualquer lugar do seu aplicativo:

    #rails c production
    :001> AUTHENTICATION['username'] => 'aa'
  2. em seguida, adicione passwords.yml a .gitignore : echo /config/passwords.yml >> .gitignore, criar um arquivo de exemplo para o seu conforto cp /config/passwords.yml /config/passwords.example.ymle, em seguida, basta editar seu arquivo de exemplo na sua consola de produção com valores de produção reais.




4

Criei um plug-in simples para as configurações de YAML: Yettings

Funciona de maneira semelhante ao código na resposta do khelll, mas você só precisa adicionar este arquivo de configuração YAML:

app/config/yetting.yml

O plug-in cria dinamicamente uma classe que permite acessar as configurações YML como métodos de classe no seu aplicativo, da seguinte maneira:

Yetting.your_setting

Além disso, se você quiser usar vários arquivos de configurações com nomes exclusivos, poderá colocá-los em um subdiretório dentro de app / config como este:

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

Então você pode acessar os valores como este:

FirstYetting.your_setting
SecondYetting.your_setting

Ele também fornece configurações padrão que podem ser substituídas por ambiente. Você também pode usar erb dentro do arquivo yml.


A repo oficial está agora em: github.com/charlotte-ruby/yettings (SO revisor rejeitou a minha edição dizendo que é muito menor)
lulalala


4

Se você usa o Heroku ou precisa manter as configurações do aplicativo como variáveis ​​de ambiente, a gema figaro é muito útil.


2

Eu gosto de usar o rails-settings para valores globais de configuração que precisam ser alterados via interface da web.


2
Eu quero usar plugins adicionais, etc, como estou aprendendo trilhos, então a melhor maneira de fazer isso seria sem plugins.
Shiv

Observe que isso usa o banco de dados para armazenar configurações, que talvez sejam muito pesadas para algumas pessoas.
Lulalala 6/03/2013

0

Algo que estamos começando a fazer no trabalho é o Hash Ordenado do ActiveSupport

O que permite definir sua configuração de maneira limpa dentro dos arquivos do ambiente, por exemplo

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

-5

Eu sugeriria uma boa abordagem sobre como lidar com a configuração em seu aplicativo. Existem três regras básicas:

  • altere sua configuração, não um código;
  • usar configurações sobre condições;
  • escreva código que significa alguma coisa.

Para ter uma visão geral mais detalhada, siga este link: Configuração do Rails da maneira correta

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.