在控制器中使用环境变量(Rails)

时间:2015-07-07 18:55:28

标签: ruby-on-rails environment-variables sendgrid

我试图在我的Rails应用程序中显示SendGrid电子邮件统计信息。

到目前为止,我已经能够以API的返回格式显示它们(例如[{"delivered"=>9, "unsubscribes"=>0, "repeat_bounces"=>2,....),但只有当我输入明文用户名时才会显示密码进入我的控制器的私有方法,因为我似乎无法使用'SENDGRID_USERNAME''SENDGRID_PASSWORD'环境变量。一个人要做什么?

总结:

NewslettersController:

  before_action :set_client, only: :index

private

    def set_client
      @client = SendGridWebApi::Client.new('the plaintext username', 'the plaintext password')
    end

简报索引视图

<p><%= @client.stats.get %></p>

还有另一个地方我可以设置@client我的视图可以访问它并且我的明文密码可以隐藏在外面的世界吗?最好是我可以放入secrets.yml的地方?

@client = SendGridWebApi::Client.new('SENDGRID_USERNAME', 'SENDGRID_PASSWORD')

返回错误的用户名和密码,即使我获得了用于从这些变量中测试的明文用户名和密码,所以我知道他们已经设置为正确的。

或者,有没有办法在我的控制器或视图中使用环境变量?

我可以在Rails控制台中设置变量然后使用它们,但由于它们没有得到保存,我无法在实际应用中访问它们。

2 个答案:

答案 0 :(得分:1)

最好使用

将您的秘密添加到系统环境变量中
export SENDGRID_USERNAME=my-super-secret-username
export SENDGRID_PASSWORD=my-super-secret-password

或者将环境变量添加到bashrc文件中。在您喜欢的文本编辑器中打开bashrc文件,即nano,vim,vi等

sudo nano ~/.bashrc

并添加/保存环境变量。之后,您需要使用源命令

触摸bashrc文件
source ~/.bashrc

在控制器中,使用ENV散列访问环境变量,如

def set_client
  @client = SendGridWebApi::Client.new(ENV['SENDGRID_USERNAME'], ENV['SENDGRID_PASSWORD'])
end

如果您想从rails应用程序中控制秘密,可以创建一个新的初始化文件并在那里定义环境变量

# config/initializer/environment_variables.rb
ENV['SENDGRID_USERNAME']='my-super-secret-username'
ENV['SENDGRID_PASSWORD']='my-super-secret-password'

将env保存在initilizer中并不是一个好方法,因为您的秘密仍以纯文本格式存在于您的代码中,并且可能会暴露。您必须将此文件添加到.gitignore文件。

答案 1 :(得分:0)

虽然我的解决方案不是secrets.yml,但这很好。

# config/initializers/my-supersecret-vars.rb
ENV['SENDGRID_USERNAME'] = 'my_super_secret_username'
ENV['SENDGRID_PASSWORD'] = 'my_super_secret_password'

请记住将其添加到.gitignore