Options for Web Applications with Ruby on Rails
(Page 1 of 4 )
In this second part of a six-part series on web development and Ruby on Rails, you_ll learn how to integrate a database with your RoR application and more. This article is excerpted from chapter 15 of the Ruby Cookbook, written by Lucas Carlson and Leonard Richardson (O_Reilly, 2006; ISBN: 0596523696). Copyright © 2006 O_Reilly Media, Inc. All rights reserved. Used with permission from the publisher. Available from booksellers or direct from O_Reilly Media. 15.4 Redirecting to a Different Location
Problem You want to redirect your user to another of your application_s actions, or to an external URL. Solution The class ActionController::Base (superclass of ApplicationController) defines a method called redirect_to, which performs an HTTP redirect. To redirect to another site, you can pass it a URL as a string. To redirect to a different action in your application, pass it a hash that specifies the controller, action, and ID. Here_s a BureaucracyController that shuffles incoming requests to and fro between various actions, finally sending the client to an external site: class BureaucracyController < ApplicationController def index redirect_to :controller => _bureaucracy_, :action => _reservation_window_ end def reservation_window redirect_to :action => _claim_your_form_, :id => 123 end def claim_your_form redirect_to :action => _fill_out_your_form_, :id => params[:id] end def fill_out_your_form redirect_to :action => _form_processing_ end def form_processing redirect_to http://www.dmv.org/ end end If you run the Rails server and hit http://localhost:3000/bureaucracy/ in your browser, you_ll end up at http://www.dmv.org/. The Rails server log will show the chain of HTTP requests you made to get there: "GET /bureaucracy HTTP/1.1" 302 "GET /bureaucracy/reservation_window HTTP/1.1" 302 "GET /bureaucracy/claim_your_form/123 HTTP/1.1" 302 "GET /bureaucracy/fill_out_your_form/123 HTTP/1.1" 302 "GET /bureaucracy/form_processing HTTP/1.1" 302 You don_t need to create view templates for all of these actions, because the body of an HTTP redirect isn_t displayed by the web browser. Discussion The redirect_to method uses smart defaults. If you give it a hash that doesn_t specify a controller, it assumes you want to move to another action in the same controller. If you leave out the action, it assumes you are talking about the index action. From the simple redirects given in the Solution, you might think that calling redirect_to actually stops the action method in place and does an immediate HTTP redirect. This is not true. The action method continues to run until it ends or you call return. The redirect_to method doesn_t do a redirect: it tells Rails to do a redirect once the action method has finished running. Here_s an illustration of the problem. You might think that the call to redirect_to below prevents the method do_something_dangerous from being called. class DangerController < ApplicationController def index redirect_to (:action => _safety_) unless params[:i_like_danger] do_something_dangerous end # .. . end But it doesn_t. The only way to stop an action method from running all the way to the end is to call return.* What you really want to do is this: class DangerController < ApplicationController def index redirect_to (:action => _safety_) and return unless params[:i_like_danger] do_something_dangerous end end Notice the and return at the end of redirect_to. It_s very rare that you_ll want to execute code after telling Rails to redirect the user to another page. To avoid problems, make a habit of adding and return at the end of calls to redirect_to or render. See Also - The generated RDoc for the methods ApplicationController::Base#redirect_to and ApplicationController::Base#url_for
|