Forum: Ruby on Rails Conditionally respond with HTTP redirect for xml_http_request

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
2dddec0f7717cae77ac6bceede6be5bc?d=identicon&s=25 Ram (Guest)
on 2009-04-08 07:52
(Received via mailing list)
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!
81b61875e41eaa58887543635d556fca?d=identicon&s=25 Frederick Cheung (Guest)
on 2009-04-08 09:20
(Received via mailing list)
On Apr 8, 6:51 am, Ram <yourstruly.vi...@gmail.com> 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
2dddec0f7717cae77ac6bceede6be5bc?d=identicon&s=25 Ram (Guest)
on 2009-04-08 09:39
(Received via mailing list)
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 Cheung <frederick.che...@gmail.com>
81b61875e41eaa58887543635d556fca?d=identicon&s=25 Frederick Cheung (Guest)
on 2009-04-08 09:58
(Received via mailing list)
On Apr 8, 8:38 am, Ram <yourstruly.vi...@gmail.com> 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
2dddec0f7717cae77ac6bceede6be5bc?d=identicon&s=25 Ram (Guest)
on 2009-04-08 10:47
(Received via mailing list)
:) 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 Cheung <frederick.che...@gmail.com>
2dddec0f7717cae77ac6bceede6be5bc?d=identicon&s=25 Ram (Guest)
on 2009-04-08 10:58
(Received via mailing list)
I am trying to implement Craig Ambrose'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!
This topic is locked and can not be replied to.