Rails控制器重定向到另一个控制器中的表单然后返回到已保存的模型

时间:2014-09-04 07:26:50

标签: ruby-on-rails braintree braintree-rails

我需要在我的Rails应用程序中做一些奇怪的事情。用户通过创建操作创建产品实例后,我需要将其保存,然后将其重定向到Braintree付款方式表单(如果他们尚未在其帐户中添加一个),然后才将其重定向到展示页面对于产品。

这是产品创建行动:

def create
    @product = Product.new(product_params)
    @product.set_user!(current_user)
      if @product.save
                if !current_user.braintree_customer_id?
                    redirect_to "/customer/new"
                else
                    redirect_to view_item_path(@product.id)
                end
      else
        flash.now[:alert] = "Woops, looks like something went wrong."
                format.html {render :action => "new"}
      end
  end

Braintree客户控制器的确认方法是:

def confirm
    @result = Braintree::TransparentRedirect.confirm(request.query_string)

    if @result.success?
      current_user.braintree_customer_id = @result.customer.id
      current_user.customer_added = true
            current_user.first_name = @result.customer.first_name
            current_user.last_name = @result.customer.last_name
      current_user.save!
            redirect_to ## not sure what to put here
    elsif current_user.has_payment_info?
      current_user.with_braintree_data!
      _set_customer_edit_tr_data
      render :action => "edit"
    else
      _set_customer_new_tr_data
      render :action => "new"
    end
  end

我想做的是什么?

1 个答案:

答案 0 :(得分:1)

您可以在重定向到braintree表单之前将产品ID存储在会话变量中,然后在完成确认之后,只需从会话中读取此ID并重定向到产品展示操作。

if !current_user.braintree_customer_id?
  session[:stored_product_id] = @product.id
  redirect_to "/customer/new"
else
  redirect_to view_item_path(@product.id)
end

请记住,如果用户知道产品ID,则只需输入有效的网址即可打开产品视图页面,因此您也应该处理此类情况。您可以将before_filter置于产品展示操作中,以检查用户是否具有脑树设置。如果你这样做,你就不需要在创造行动中有条件。您始终可以重定向到产品展示页面,而before_filter将检查用户是否需要更新braintree数据。