I want to occasionally render a certain page after an action (other than the default rendering). I was thinking that an after_filter would be the ticket. However, my initial attempts at including redirect_to in an after_filter result in a double render. Is the after_filter the right tool, or is there a better way?
Let me state this another way:
Can I use redirect_to in an after filter to render some view other than the default view? If so, how?
You can only call redirect or render once... so I don't think you can do this.
Looks like ActionController calls performed? to see if redirect or render has already been called (probably a private method). Don't see any way to reset the performed? status. But, you could probably hack ActionController to allow you to do so.
b
Rick wrote:
Well, there must be some way to get the same effect. Let's say I'm looking at a blog, I am not logged in, and I want to write a comment. I can't yet, because I'm not logged in, so I'm redirected to the login screen. After I submit my user/pass I want to go back to the comment page, not to wherever the login action normally goes to.
I know someone must have done this!
redirect_to :back might give you what you're looking for.
Are you talking about something like…
def catcher_filter unless logged_in? session[:original] = request.path redirect_to login_url end end
def login_method
do the login
if login_successful? if session[:original] redirect_to session[:original] session[:original] = nil # Don’t forget to reset! else redirect_to dashboard_url end end
end
RSL
Rick wrote: > Well, there must be some way to get the same effect. Let's say I'm > looking at a blog, I am not logged in, and I want to write a comment. > I can't yet, because I'm not logged in, so I'm redirected to the login > screen. After I submit my user/pass I want to go back to the comment > page, not to wherever the login action normally goes to. > > I know someone must have done this!
I've done what you're talking about here by storing the request_uri in the session, sending the user to log in and then having code in the login controller that redirects the user to the uri in the session if it's there, or to the default url if not.
That's all controller logic (the authentication stuff I usually do as a before_filter in ApplicationController)... I think your dilemma -- if I'm understanding correctly -- is that you want to change the render decision that's already been made in an action in an after_filter. *That* is tricky.
If you're just trying to do an authentication filter, I'd try making it a before_filter. That way, if they're not authenticated, the redirect takes them to log in and there's no double-render. If they are authenticated, there's no redirect and they wind up in the action they intended to call... and still there's no double-render.
If you have the agile book, they show this approach in a fair amount of detail... and it's fairly simple to add the code to that to just store off the requested uri and get it back out to send the user to after they've logged in.
HTH,
b