Вставка действий контроллера между действиями в Rails — лучшие практики

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

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

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

ProductsController#show -> OrdersController#edit

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

Поэтому мне интересно, чтобы максимально-минимально изменить основной код в веселье, как мне сделать так, чтобы процесс был больше похож на этот:

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

Что я думаю сделать, это:

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

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

Спасибо за помощь, Ланс


person Lance Pollard    schedule 08.02.2010    source источник


Ответы (3)


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

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

person wesgarrison    schedule 14.02.2010

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

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

person Matchu    schedule 08.02.2010

Вы пробовали 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, но это определенно можно сделать.

person winfred    schedule 21.06.2011