Вставка действий контроллера между действиями в Rails - Лучшие практики - PullRequest
3 голосов
/ 09 февраля 2010

Каковы лучшие практики (или обычные практики), когда речь идет о добавлении дополнительных шагов в процесс в Rails?

Например, я работаю с платформой электронной коммерции Spree , и я хотел бы добавить многошаговую форму, которую люди должны заполнять при попытке "Добавить в корзину" Продукт.

Текущая реализация добавления товара в корзину в основном:

ProductsController#show -> OrdersController#edit

Это добавляет товар в корзину и оставляет вас в корзине.

Так что мне интересно, чтобы как можно меньше изменить основной код в spree, как мне сделать так, чтобы процесс был примерно таким:

ProductsController#show -> SurveysController#show -> (survey stuff...) -> OrdersController#edit

Я думаю сделать следующее:

  • изменить "products / show.html.erb", чтобы оно перешло на surveyys_controller.rb. Также измените products_controller.rb так, чтобы он вставил session[:redirect_to] = order_checkout_path, что я могу обработать в SurveysController.
  • или просто сделать эти дополнительные всплывающие окна, и когда я доберусь до последнего, пусть вызовет оригинальный метод.

Что с этим не так? Какой подход лучше? Это вопрос о том, как люди работают над созданием многошаговых процессов без изменения кода ядра. Не волшебник , просто добавление дополнительных вещей в середине других вещей.

Спасибо за вашу помощь, Lance

Ответы [ 3 ]

1 голос
/ 15 февраля 2010

Вы можете проверить restful_workflow :

Этот плагин обеспечивает стиль интервью рабочий процесс в контроллере, похожий на TurboTax, но без необходимости сохранения модели в базу данных сразу. Все данные хранятся в сеансе если не отменено.

0 голосов
/ 21 июня 2011

Вы пробовали orders_controller_decorator.rb?

OrdersController.class_eval do
  before_filter :show_survey, :only => :populate
  def new_survey
    #regular stuff

    respond_to do |format|
      format.html do
        #if you've already been through this process, skip the before_filter
        redirect_to(new_order_line_item_url(session[:order_line_item])) and return if session[:order_line_item]
        #otherwise point to the form and store the order data in session 
        session[yeahyougetthepoint]
        render 'new_survey' 
      end
    end
  end
  def create_survey
    #regular stuff
    respond_to do |format|
      format.html {redirect_to new_order_line_item(session[:order_line_item]}
  end
end

Я не уверен на 100% в процессе 'add_to_cart', но это можно легко вывести, просматривая все это в журнале. Немного странно вкладывать свой собственный поток в Spree, но это определенно можно сделать.

0 голосов
/ 09 февраля 2010

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

Переменная сеанса мне подходит. Коротко и просто. Возможно, вы захотите сделать свой ключ более описательным, чтобы не видеть будущих конфликтов.

...