Хорошо, вам нужно создать класс для работы с вашим клиентом с шлюзом Braintree и без него. Сначала создайте класс:
class Customer
attr_accessor :company, :first_name, :last_name, :phone, :gateway
def initialize gateway_id=nil
begin
@gateway = Braintree::Customer.find(gateway_id) unless gateway_id.nil?
rescue Braintree::NotFoundError
end
end
def company
@gateway.nil? ? @company : @gateway.company
end
# Implement the rest of the methods this way as well. You can even use
# meta-programming so that you don't repeat yourself.
end
Вы заметите, что вызов Customer.new (id) .company будет работать с идентификатором или шлюзом и без него, потому что если будет возвращен несуществующий @company шлюз и если будет присутствовать шлюз, компания шлюза будет быть возвращенным.
Наконец, подключите это к вашей модели:
class Account
def customer
@customer ||= Customer.new(self.gateway_customer_id)
end
def customer= h
@customer = Customer.new
@customer.company = h[:company]
...
@customer
end
end
Вам придется изменить способ записи кода в API, чтобы, например, использовать customer.company вместо customer [: company], но, вероятно, вы можете написать функцию в классе Customer, чтобы сделать это легко.
Вы должны будете изменить свою форму на:
<% f.fields_for :customer, @account.customer do |customer_fields| %>