Search code examples
ruby-on-railsbraintreebraintree-rails

Rails controller redirect to form in another controller then back to saved model


I need to do something kind of weird in my Rails app. Once a user creates a Product instance through the create action, I need it to save and then redirect them to a Braintree payment method form if they haven't already added one to their account, and only then redirect them to the show page for the product.

Here's the product create action:

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

The confirm method for the Braintree customer controller is this:

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

Is what I want to do possible?


Solution

  • You can store product id in a session variable before redirecting to braintree form, a then after complete confirmation just read this id from session and redirect to product show action.

    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
    

    Keep in mind that user can open product view page just by entering valid url address if he knows product id, so you should also handle this kind of situation. You can put before_filter in product show action to check if user has brain tree setup. If you go this way, you don't need to have condition in create action. You can always redirect to product show page and before_filter will check if user needs to update braintree data.