2010-02-08 76 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」,以便它去到surveys_controller.rb。還可以修改products_controller.rb以放入session[:redirect_to] = order_checkout_path,我可以在SurveysController中處理這些問題。
  • 或者只是讓那些額外的東西彈出,當我到最後一個時,讓它調用原始方法。

這是什麼問題?什麼是更好的方法?這是一個更普遍的問題,人們如何在不修改核心代碼的情況下構建多步進程。不是wizard,只是在其他東西中添加額外的東西。

感謝您的幫助, 蘭斯

回答

0

它不是以RESTful web應用程序一個非常標準的流程,所以無論你做什麼必須要有人的hackish,因爲Rails提供沒有簡單的方法。

會話變量對我來說似乎很好。簡短而簡單。不過,你可能想讓你的關鍵詞更具描述性,這樣你就不會看到未來的衝突。

1

你可以看看restful_workflow

此插件提供的採訪風格在控制器 工作流程,類似於 TurboTax的,但無需 模型立即保存到數據庫中。 所有數據都存儲在會話 中,除非被覆蓋。

0

你試過了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 

我不知道的「add_to_cart」過程的100%,但可以通過在日誌整件事挖輕易地推導出來。這是一個有點奇怪把你自己的流量到施普雷,但它絕對可以做到。