在Rails中的操作之间插入Controller操作 - 最佳实践

时间:2010-02-08 22:59:58

标签: ruby-on-rails redirect controllers spree

在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,只是在其他事情的中间添加额外的东西。

感谢您的帮助, 兰斯

3 个答案:

答案 0 :(得分:1)

您可以查看restful_workflow

  

这个插件提供了面试风格   控制器中的工作流程,类似于   TurboTax,但无需保存   模型立即到数据库。   所有数据都存储在会话中   除非被覆盖。

答案 1 :(得分:0)

这不是一个RESTful网络应用程序中非常标准的流程,所以无论你做什么都必须是一个hackish,因为Rails没有提供简单的方法。

会话变量对我来说似乎很好。简短而简单。但是,您可能希望使您的密钥更具描述性,以便您不会看到未来的冲突。

答案 2 :(得分: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

我不是100%肯定'add_to_cart'过程,但可以通过在日志中挖掘整个事物来轻松推断出来。将你自己的流量投入Spree有点奇怪,但绝对可以做到。