Conditionally respond with HTTP redirect for xml_http_request


#1

Hi all,

I have select box in one of my views which lists a few contacts.
I also have an option in this select box to add a new contact.
There is also an observe_field hook to this select box that Ajax
requests further info about the selected contact from the controller
and displays it in an adjacent “info” div.

Now, I need to redirect the user to the New Contact page from the
controller if the selected value from the select box is “new contact”.

This is the controller code I have now

if request.xml_http_request?
if !@contact.blank?
render :partial => “show”, :layout => false
elsif params[:id] == “new contact”
redirect_to new_contact_path
else
render :text => “Please select a contact”
end
end

This renders the New Contact page in the “info” div. Whereas, I want
the user to be completely redirected to the New Contact page like a
HTTP response would.
Any thoughts on how I can handle this? Any ideas welcome…
Thanks!


#2

On Apr 8, 6:51 am, Ram removed_email_address@domain.invalid wrote:

end

This renders the New Contact page in the “info” div. Whereas, I want
the user to be completely redirected to the New Contact page like a
HTTP response would.
Any thoughts on how I can handle this? Any ideas welcome…
Thanks!

Two ways of doing this: either the observe_field thingy has a callback
that redirects in the right circumstances or you switch to using
render :update (and then use page.redirect_to), In the latter case you
have to use render :update for all of these 3 possibilities and you
need to change your observe_field invocation to not pass the :update
option.

Fred


#3

Hi Fred,

Thanks for your response.

render :update
Ive got quite a few Ruby conditions and styling going in the js.erb
file im using now to display the contact information. And ive got more
possibilities than the 3 ive shown above in the controller. So this
might not be the right option for me. Right?

observe_field callback
This might work for me. Right now, the only callbacks I have on the
observe_field are showing and hiding the spinner. I have never written
custom callbacks on Rails JS helpers. Could you help me through this?

So im guessing I should be having something like this

<%= observe_field ‘contact_id’, :frequency => 0.5, :update =>
‘info’, :before => “Element.show(‘spinner’)”,
:success => “handle_contact_request(value);”, :url =>
show_contact_path,:method =>:get,
:with => ‘contact_id’ %>

and in application.js

function handle_contact_request(value){

     Element.hide('spinner');
     if value=="new contact"
     {
            //how do i redirect to the New Contact page?
     }
     else
     {
           //show contact info. But how do I handle the conditions

and styling??
}
}

Am I getting the basic idea right? If yes, how can I handle the
conditional redirecting and the rest in Javascript?
Thanks again Fred.

On Apr 8, 12:20 pm, Frederick C. removed_email_address@domain.invalid


#4

On Apr 8, 8:38 am, Ram removed_email_address@domain.invalid wrote:

Hi Fred,

Thanks for your response.

render :update
Ive got quite a few Ruby conditions and styling going in the js.erb
file im using now to display the contact information. And ive got more
possibilities than the 3 ive shown above in the controller. So this
might not be the right option for me. Right?

I’m not sure this would be a problem - seems like a few calls to
page.replace_html ‘info’, :partial => ‘blah’ would do it in the other
cases.

            :success => "handle_contact_request(value);", :url =>

show_contact_path,:method =>:get,
:with => ‘contact_id’ %>

Nearly. your success callback gets 2 thigns: response and
responseJSON. responseJSON contains whatever JSON you put in the X-
JSON header of your response. You callback can be as simple as

check_for_redirect(json){
if(json && json.redirect)
page.location = json.redirect
}

and then pass :success => “check_for_redirect(responseJSON)”. All you
need to do is to set that header appropriately if you want a redirect
to happen.

Fred


#5

:slight_smile: You were right. It was easy enough to use render :update and
replace_html with :partial to accomplish it.

I am however curious as to how we can do this using JSON. I started
reading about JSON for another feature I needed but I realised I dint
need JSON for it. I feel it would be a good exercise for me to
implement it in tackling this problem. Could you explain a little bit
more about the code you have shown me above or point me to where I can
find the documentation explaining this? From what I remember, JSON is
a format (Object Notation) to represent ActiveRecord objects (in
Rails) for JS to handle. But setting the header, responseJSON et all
is new to me.

Thanks Fred!

On Apr 8, 12:57 pm, Frederick C. removed_email_address@domain.invalid


#6

I am trying to implement Craig A.'s Redbox for some form
submissions.
Ideally for me, when the user selects “Add contact” a redbox modal
window should open with the New Contact form and on submission, the
contacts select box on the main page should get updated with the newly
added contact.
I was looking into invoking Redbox from the controller for this
(http://ahref.in/8dc58) but I couldnt quite grasp the discussion
there.
Can Redbox be brought in here without too much trouble?
thanks again for you inputs!