Лучшие практики Rails - куда должен идти этот код? - PullRequest
1 голос
/ 01 марта 2012

Есть пара мест, где я могу делать то, что мне нужно, но я не уверен, где лучшее место в соответствии с хорошими практиками.

У меня есть контроллер Orders, и после успешногоПорядок создан. Я хочу создать подписку (но только в том случае, если заказ выполнен успешно) и реферал (но только в том случае, если заказ связан с ним).

Теперь очевидным выбором является использование after_create длямодель заказа ... но ... как я могу получить данные сеанса в это?(Идентификаторы рефералов, идентификаторов друзей и идентификаторов ваучеров находятся только в сеансе, так как нет необходимости сохранять их в БД заказа).

Поэтому я должен просто создать объекты Subscription и Referral в действии createУ меня он есть в мо) или есть лучший способ?

Вот мое действие по созданию: (@ order.purchase возвращает true только если платеж был успешным)

def create
if @order.save
    if @order.purchase
      Subscription.create(:order_id => @order.id, :product_id => @order.product_id)
      if @order.voucher
        Referral.create(:user_id => session[:friend_id], :order_id => @order.id, 
                        :voucher_amount => @voucher_value)
      end
      render :action => "success"
    else
      render :action => "failure"
    end
  else
    render :action => 'new'
  end
end

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

Ответы [ 2 ]

0 голосов
/ 01 марта 2012

У меня недавно был похожий вопрос, пожалуйста, посмотрите, я думаю, что простой виртуальный атрибут в обратном вызове сделает это и для вас.

Извлечение текущего пользователя в фильтр after_create

0 голосов
/ 01 марта 2012

использование обратных вызовов облегчит вашу жизнь, вам нужно использовать after_save

делать все свои вещи в call_ afterback модели заказа.см. rails api doc для обратного вызова здесь

Редактировать: если переменная сеанса недоступна для модели, вы можете использовать метод post_save для работы со всей логикой, которая также принимает все требуемые параметры, такие как

как

class Order < ActiveRecord::Base
  def post_save require_attr

   #create subscriptions

   # create referral

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