В классе Token нет метода токенов.Поскольку вы создаете три токена, вам не нужен экземпляр @token.Просто сделайте save_with_payment методом класса:
def create
if Token.save_with_payment(params[:token])
redirect_to :controller => "products", :action => "index"
else
redirect_to :action => "new"
end
end
class Token < ActiveRecord::Base
require 'digest/sha1'
def self.save_with_payment(attributes)
attributes.merge!(unique_token: Digest::SHA1.hexdigest("foo"))
3.times do
self.create!(attributes)
end
end
end
Надеюсь, это поможет.
Возможно, вы также захотите обернуть цикл в начало / спасение.В противном случае, если 2 или 3 создать!не получается, что вы получаете токены и перенаправляете на «новый».
Ответ на первый комментарий: Это не сработает, если вы используете метод класса.Вы не можете назвать действительным?потому что вы не в контексте экземпляра токена.Я не рекомендую придерживаться метода экземпляра.Если вы измените его на метод класса, вы захотите обернуть его в блок транзакции:
def self.save_with_payment(attributes)
transaction do
attributes.merge!(unique_token: Digest::SHA1.hexdigest("foo"))
3.times do
self.create!(attributes)
end
rescue
false
end
end
Это должно откатить транзакции SQL, если какая-либо из операций создания!вызовы терпят неудачу и возвращают false контроллеру create action.
Я бы извлек код этого клиента из Token (Token не должен заботиться о создании / получении клиента) и поместил бы его в действие контроллера.Передайте соответствующую информацию в save_with_payments.Нравится:
self.save_with_payments(customer, attributes)
...
end