ruby модель контроллера объектно-ориентированный дизайн - PullRequest
1 голос
/ 31 января 2011

Я реализовал платеж Paypoint в проекте, над которым я работаю, и на проходе я использовал класс, вызванный контроллером, для обработки платежа и обработки ответа, теперь я переделал это для обработки платежа на обратный вызов before_create, чтобы в случае сбоя платежа преобразование откатывалось, и я добавлял в модель ошибку, а теперь код контроллера, если просто проверяет, сохраняется ли модель

старый код контроллера

def create
 @model = Model.new(params[:xxx])
 if @model.valid?
    if PayPointPayment.authorise_payment(@model)
      redirect_to new_step
    else
       render :new
  else
    render :new
end

новый код контроллера

def create
    @model = Model.new(params[:xxx])
    if @model.save
        redirect_to next_step
    else
        render :new
end

код новой модели

class Model
    before_create :process_payment

    def process_payment
        if PayPointPayment.authorise_payment(self)
            return true
        else
            <add errors>
            return false
    end
end

просто интересно, что думают об этом типе дизайна: хорошо это или плохо, или просто неправильно

1 Ответ

2 голосов
/ 31 января 2011

Вместо выполнения платежа через before_create может оказаться более целесообразным выполнить платеж как часть проверки.Возможно, он будет работать идентично, но сообщение, которое он посылает программисту, состоит в том, что проверка - это ряд требований, которые должны быть выполнены, прежде чем объект модели может быть сохранен, и before_create может позаботиться о предварительных требованиях, которые необходимо выполнить.выполняется для создания конечной модели.

Кроме того, если вы когда-либо обновите объект модели, он может изменить модель настолько, чтобы потребовать повторной проверки, но before_create не поймет это.

Конечно, по сравнению с вашим оригинальным механизмом, это, вероятно, огромное улучшение почти во всех отношениях - оно позволит использовать вашу модель вне оригинального контроллера, не отдавая продукт / контент пользователям, которые не заплатили.(Скажем, если вы предоставляете интерфейс SOAP, XMLRPC, email или REST, который не проходит через ваш контроллер.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...