#ruby-on-rails #architecture
#ruby-on-rails #архитектура
Вопрос:
я провел мозговой штурм наилучшего способа сделать это и решил, что мне следует обратиться к сообществу за некоторыми идеями / ясностью.
в принципе, с помощью одного контроллера платежей я хочу иметь возможность обрабатывать различные варианты оплаты, которые может выбрать пользователь. например, мой контроллер получает запрос post с помощью :payment_option => paypal
. я хочу передать логику для обработки конкретных операций paypal, а затем передать контроллеру URL-адрес (для paypal) для перенаправления.
я выполнял params[:payment_option].constantize
инициализацию класса Paypal, но проблема, с которой я столкнулся, заключалась в невозможности доступа к различным частям данных, которые требуются paypal (т. Е. Текущая информация о пользователе, IP-адрес запроса, данные cookie, помощники URL и т.д.).
затем я подумал, что, возможно, у меня мог бы быть модуль paypal, но как включить правильный платежный модуль программно? и казалось, что я, возможно, неправильно использую концепцию модуля, потому что я бы использовал модуль для конкретной логики, а не для общей логики.
итак, если пользователь вместо этого выбирает Google checkout, контроллеру, независимо от способа оплаты, должны потребоваться только общие инструкции
берем параметры [:payment_option] получаем payment_option_url получаем payment_option_response
есть мысли о хорошем подходе к выполнению чего-то подобного? в прошлом я сталкивался с подобными сценариями, но никогда не был уверен, что это лучший маршрут.
Ответ №1:
class Payment
def self.handle
raise 'must impliment in subclass'
end
end
class PaypalPayment < Payment
end
class GooglePayment < Payment
end
class PaymentController < ApplicationController
def show_me_the_money
case params[:payment_option]
when 'paypal': url = PaypalPayment.handle params
when 'google': url = GooglePayment.handle params
end
redirect_to url
end
end