Rails:将API密钥传递给Controller

时间:2014-12-15 03:04:17

标签: ruby-on-rails ruby twilio

我正在努力将Twilio API集成到我的Rails应用程序中。我按照教程here进行了操作,但是我遇到了将API密钥插入控制器的问题。他们建议使用ENV变量,但是,我很难绕过如何做到这一点(仅使用Rails几周)。

所以我猜我有两个问题:

  • 在开发/本地环境中使用ENV变量的最佳/最简单方法是什么?
  • 如果我将值硬编码到secrets.yml文件中,那应该不行吗?我知道这对于安全性并不理想,但是对于测试,它是否有效或是否需要以某种方式进行初始化?

错误:

ArgumentError in NotificationsController#notify - Account SID and auth token are required

notifications_controller.rb

require 'twilio-ruby'

class NotificationsController < ApplicationController

  skip_before_action :verify_authenticity_token

  def notify
    client = Twilio::REST::Client.new Rails.application.secrets.twilio_account_sid, Rails.application.secrets.twilio_auth_token
    message = client.messages.create from: '+18588779747', to: '+18583821931', body: 'First ever MyMedy notifcation test.'
    render plain: message.status
  end

end

secrets.yml

development:
  secret_key_base: 'XXXXXXXXXXXXXXXXXXX'
  twilio_account_sid: <%= ENV["TWILIO_ACCOUNT_SID"] %>
  twilio_auth_token: <%= ENV["TWILIO_AUTH_TOKEN"] %>

test:

production:
  secret_key_base: 'XXXXXXXXXXXXXXXXXXX'
  twilio_account_sid: <%= ENV["TWILIO_ACCOUNT_SID"] %>
  twilio_auth_token: <%= ENV["TWILIO_AUTH_TOKEN"] %>

2 个答案:

答案 0 :(得分:2)

如果您只是希望控制器操作正常工作,请随意粘贴值以消除一个依赖项。在确定它正在工作之后,将其移动到secrets.yml或application.yml文件中。

另外,在使用rails时,最好坚持RESTful操作的约定。而不是使用它:

require 'twilio-ruby'

class NotificationsController < ApplicationController

  skip_before_action :verify_authenticity_token

  def notify
    client = Twilio::REST::Client.new Rails.application.secrets.twilio_account_sid, Rails.application.secrets.twilio_auth_token
    message = client.messages.create from: '+18588779747', to: '+18583821931', body: 'First ever MyMedy notifcation test.'
    render plain: message.status
  end

end

您可能想要使用它:

require 'twilio-ruby'

class NotificationsController < ApplicationController

  skip_before_action :verify_authenticity_token

  def create
    client = Twilio::REST::Client.new Rails.application.secrets.twilio_account_sid, Rails.application.secrets.twilio_auth_token
    message = client.messages.create from: '+18588779747', to: '+18583821931', body: 'First ever MyMedy notifcation test.'
    render plain: message.status
  end

end

您可能还希望将其中一些方法转换为更干净的模型方法,甚至是service object

答案 1 :(得分:2)

我是Twilio的开发人员传道者。

在Rails应用程序中设置ENV变量的方法有很多种。最简单的方法是在运行rails server命令的终端窗口中运行以下几行

export TWILIO_ACCOUNT_SID=ACXXXXX
export TWILIO_AUTH_TOKEN=YYYYYY

然后,在该窗口的生命周期中,将设置这些环境变量。

要获得更持久的解决方案,您可以将这几行添加到~/.bash_profile

export TWILIO_ACCOUNT_SID=ACXXXXX
export TWILIO_AUTH_TOKEN=YYYYYY

然后source ~/.bash_profile将变量加载到当前终端窗口,然后加载您打开的任何其他终端窗口。

也有一些宝石可以提供帮助。查看envyableFigarodotenv,这些都可以用来在应用的基础上在应用中设置ENV变量。