Ruby: How to initialize an active merchant gateway

2019-09-03 07:35发布

问题:

From this http://www.rubydoc.info/github/Shopify/active_merchant/ActiveMerchant%2FBilling%2FBase.gateway

I should just initialize an instance of active_merchant using this

gateway = ActiveMerchant::Billing::Base.gateway( gateway_name ).new(
:username => :some_credential 
:password => :some_other_credential
)

But I don't know :username or :password in advance, however they are in the fixtures file https://github.com/activemerchant/active_merchant/blob/master/test/fixtures.yml here. So how to do this properly?

For an example, in the fixtures.yml file we can see this..

adyen: username: '' password: '' merchant_account: ''

Accordingly we can initialize with this..

gateway = ActiveMerchant::Billing::Base.gateway( 'adien' ).new(
username:         => :some_credential 
password:         => :some_other_credential
merchant_account: => some_more_credential
)

I need to be able to initialize the gateway instance without hard-coding the username:, password: and merchant_account: parameters in the above example.

Thanks in advance!

回答1:

You should take a look at environment variables. They let you define variables in a safe palce and refer to them when needed.

Somewhere you would define PASSWORD=mysecretpassword and then in the Rails code you refer to it as ENV["PASSWORD"]

There are many ways of doing this. Take a look here:

http://railsapps.github.io/rails-environment-variables.html



回答2:

The username, password, and merchant_account are instance variables so you need to change them with instance_variable_set

gateway.instance_variable_set(:@username, :some_username)
gateway.instance_variable_set(:@password, :some_password)
gateway.instance_variable_set(:@merchant_account, :some_merchant_account)


回答3:

I think i can answer my own question. One should pass every different initialization with its own hash..

require 'active_merchant'

    settings = {name: 'braintree_blue', merchant_id: 'x', public_key: 'y', private_key: 'z'}
    another_settings = {name: 'trust_commerce', login: 'TestMerchant', password: 'password'}

Gateway = ActiveMerchant::Billing::Base::gateway(settings[:name]).new(settings)
Another_Gateway = ActiveMerchant::Billing::Base::gateway(another_settings[:name]).new(another_settings)

puts Gateway.options
puts Another_Gateway.options

Note that I could pass different options without the need to hardcode any keys, which is what i desired.