Search code examples
ruby-on-railsconfirmationcustom-url

How do I define a custom URL for a form confirmation page?


I am creating a basic product landing page with Rails in which users can enter their email address to be notified when the product launches. (Yes, there are services/gems etc that could do this for me, but I am new to programming and want to build it myself to learn rails.)

On successful submit of the form, I would like to redirect to a custom '/thanks' page in which I thank users for their interest in the product (and also encourage them to complete a short survey.)

Currently, successful submits are displayed at "/invites/:id/" eg "invites/3" which I do not want since it exposes the number of invites that have been submitted. I would like to instead redirect all successful submits to a "/thanks" page.

I have attempted to research "rails custom URLs" but have not been able to find anything that works. The closest I was able to find was this Stackoverflow post on how to redirect with custom routes but did not fully understand the solution being recommended. I have also tried reading the Rails Guide on Routes but am new to this and did not see anything that I understood to allow for creating a custom URL.

I have placed my thanks message which I would like displayed on successful form submit in "views/invites/show.html.haml"

My Routes file

resources :invites
root :to => 'invites#new'

I tried inserting in routes.rb:

post "/:thanks" => "invites#show", :as => :thanks

But I don't know if this would work or how I would tell the controller to redirect to :thanks

My controller (basically vanilla rails, only relevant actions included here):

def show
    @invite = Invite.find(params[:id])
    show_path = "/thanks"

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @invite }
    end
  end

# GET /invites/new
# GET /invites/new.json
def new
  @invite = Invite.new

  respond_to do |format|
    format.html # new.html.erb
    format.json { render json: @invite }
  end
 end

 # POST /invites
 # POST /invites.json
 def create
   @invite = Invite.new(params[:invite])

   respond_to do |format|
     if @invite.save
       format.html { redirect_to @invite }
       #format.js { render :action => 'create_success' }
       format.json { render json: @invite, status: :created, location: @invite }
     else
       format.html { render action: "new" }
       #format.js { render :action => 'create_fail' }
       format.json { render json: @invite.errors, status: :unprocessable_entity }
     end
   end
 end

It would seem as if creating a standard URL for displaying a confirmation would be relatively straightforward. Any advice on how to achieve this would be appreciated.


Solution

  • I guess you want to redirect after your create action, which is executed when the form is submitted.

    Just add redirect_to in the following way:

    def create
      @invite = Invite.new(params[:invite])
    
      if @invite.save
        ...
        redirect_to '/thanks'
      else
        ...
        redirect_to new_invite_path # if you want to return to the form submission page on error
      end
    end
    

    I omitted some of the code for brevity.

    In your routes add:

    get '/thanks', to: "invites#thanks"
    

    Add the thanks action to your invites controller:

    def thanks
      # something here if needed
    end
    

    And create a thanks.html.erb page in app/views/invites.