1

Я использую служебные объекты для абстрактной функции оплаты полосы в свой класс. Я использую этот метод https://gist.github.com/ryanb/4172391, о котором говорил ryan bates.Объекты службы Rails

class Purchase 
    def initialize(order) 
    @order = order 
    end 

    def create_customer 
    customer = stipe create customer 
    if customer 
     charge_customer(customer) 
    else 
     stipe error in creating customer 
    end 
    end 

    def charge_customer(customer) 
     if charge is sucessfull 
     update_order(charge details) 
     else 
     stripe error in charging card 
     end  
    end 
    def update_order 
    @order.update(payment attributes) 
    end 
end 

Тогда в контроллере порядка я делаю что-то вроде

def create 
@order = Order.new(params[:order]) 
if @order.save 
    payment = Payment.new(@order) 
else 
    render 'new' with flash message "payment error" 
end 
end 

Мой вопрос, как я получаю сообщения об ошибках ножка («ошибка ножка в создании клиента» и «ошибка полосы в зарядная карта ") для отображения пользователю? Или я могу вызвать объект службы в модели заказа и добавить его для заказа сообщений об ошибках? Например, контроллер
Заказать

@order.save_with_payment 

модель Заказать

def save_with_payement 
    payment = Payment.new(self) 
    #update order 
    self.payment_token = payment.token 
    etc 
end 

Если я могу сделать это с моделью, как я сделать проверку, которая показывает ошибки нашивки?
Спасибо заранее.

ответ

0

Я считаю, что обслуживание должно отвечать за обработку всего этого. поэтому он может выглядеть следующим образом

def create 
    @payment = Payment.new(params[:order]) 
    if @order = @payment.execute_transaction 
    [...] 
    else 
    [...] 
    end 
end 

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

+0

Привет, спасибо за ваш ответ. Единственная проблема в том, что у меня есть много защищенных атрибутов в параметрах [: order], которые будут установлены вручную и подтверждены, например, с помощью product_id, чтобы получить продукт и проверить, равна ли сумма продукта в параметрах [: order] и установите сумму, которая будет взиматься с продукта, найденного с идентификатором продукта, так как любой пользователь может легко обойти проверку количества javascript. Есть ли способ установить защищенные атрибуты из класса оплаты? – Saff

+0

вам придется реорганизовать свой класс, чтобы он работал с таким сервисом. – phoet

+0

Рефакторинг как? – Saff

2

Прежде всего старайтесь как можно больше разделить проблемы. Уже кажется, что ваш класс Purchase/Payment делает слишком много, возможно, он должен делегировать часть его подпрограмм другим объектам службы.

Во-вторых, я согласен с phoet. Я не вижу причины, по которой вы не будете передавать хэши params для обслуживания объекта. В нашем последнем проекте мы полностью полагаемся на объекты обслуживания, которые мы называем фабриками, чтобы производить/манипулировать объектами модели. В вашем случае можно сделать так:

class OrderFactory 
    def self.create(params) 
    new(params).create 
    end 

    def initialize(params) 
    @order = Order.new(params[:order]) 
    end 

    def create 
    @payment = Payment.new(self) 
    @order.payment_token = payment.token 
    #.... 
    end 
end 

Говоря о валидациях - Вы можете добавить методы проверки на равнинные объекты Руби. Например, используя ActiveModel: http://yehudakatz.com/2010/01/10/activemodel-make-any-ruby-object-feel-like-activerecord/ Затем вы можете создать собственные валидаторы, like Ryan suggested.

Или Вы можете использовать драгоценный камень, например Virtus, и добавить некоторые пользовательские правила валидации.

+0

Параметры param. потому что многое из того, что находится в params, защищено attrs и должно быть проверено с другими значениями модели, прежде чем вручную обновлять их, но спасибо, я посмотрю на эти ссылки и попробую их сейчас. – Saff

+1

Это не противоречит тому, что я уже опубликовал. Вы можете создать метод в своей модели заказа, чтобы выполнить эту логику пользовательского назначения. Или инкапсулируйте эту логику в другой метод в OrderFactory или даже отдельный объект. –

+0

Я вижу, приветствует помощника. – Saff

0

Я задал очень похожий вопрос только один день назад. Ответ, который я получил, действительно очень полезен (кредит @ gary-s-weaver), поэтому взгляните.

Rails generic errors array

Я пошел с rescue_from подход в конце концов, и это хорошо работает для меня. Дайте мне знать, как вы поживаете, поскольку меня очень интересует эта область. И если вам нужны какие-то образцы кода, дайте мне крик.