2010-02-08 5 views
3

Что такое лучшие практики (или обычные практики), когда дело доходит до добавления дополнительных шагов в процесс в Rails?Вставка элементов управления между действиями в Rails - наилучшая практика

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

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

ProductsController#show -> OrdersController#edit

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

Так мне интересно, для того, чтобы наиболее минимально изменить основной код в Шпрее, как я делаю это так, процесс больше похож на это:

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

Что я имею в виду необходимо:

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

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

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

ответ

0

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

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

1

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

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

0

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