архитектура rails / вопрос о наилучшей практике

#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