I have been try to make a page where a user can add something to a list and then delete something from the same list all without re-loading the page. The adding part is easy, but the deleting part is turning out to be a pain. A user by the name of Philip gave me some very helpful hints: Put the snip of rHTML that needs to refresh into a partial. Include it the normal way, like this: <div id=''refresh_me''> <%= render :partial => ''my_partial'' %> </div> Now wire link_to_remote up to an action that looks like this: def my_action return unless request.xhr? render :update do |page| # <-- I call that rjs sometimes! page.replace_html ''refresh_me'', :partial => ''my_partial'' end end The deal is that almost* anything you can pass to render, you can also pass to the second argument to JavaScriptGenerator#replace_html. The first code injects raw HTML into your page as it renders, before it goes over the wire. The second snip renders the partial, then creates JavaScript containing Element.update(''refresh_me'', ''<my partial html codes>''). This goes over the wire, and the Ajax handlers from prototype.js will replace the innerHTML member of that <div id=''refresh_me''> with the new version. (Question for the lifers - is it _really_ "almost anything"? Or is it "anything"!?) -- Phlip http://www.oreilly.com/catalog/9780596510657/ "Test Driven Ajax (on Rails)" assert_xpath, assert_javascript, & assert_ajax This does not work, however, it just reloads the entire page within the list. Does anyone have any other ideas or sugestions. I realize that I am probably implementing the above code wrong, but I have tried every way that I can think of. Thanks, ~s -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
It looks like this. ''hotel_info-refresh'' is the name of the div and ''delete_hotel_info'' is the name of the method that does the destroy. I will try giving each item an id. <%= link_to_remote ''Delete'', :update => ''hotel_info_refresh'', :action => ''delete_hotel_info'', :id => @user.id %> Thanks again, for your help. -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
> I have been try to make a page where a user can add something to a list > and then delete something from the same list all without re-loading the > page. The adding part is easy, but the deleting part is turning out to > be a pain. > > A user by the name of Philip gave me some very helpful hints: Put the > snip of rHTML that needs to refresh into a partial. Include it the > normal way, like this: > > <div id=''refresh_me''> > <%= render :partial => ''my_partial'' %> > </div> > > Now wire link_to_remote up to an action that looks like this: > > def my_action > return unless request.xhr? > render :update do |page| # <-- I call that rjs sometimes! > page.replace_html ''refresh_me'', :partial => ''my_partial'' > end > end > > The deal is that almost* anything you can pass to render, you can also > pass to the second argument to JavaScriptGenerator#replace_html. > > The first code injects raw HTML into your page as it renders, before it > goes over the wire. The second snip renders the partial, then creates > JavaScript containing Element.update(''refresh_me'', ''<my partial html > codes>''). This goes over the wire, and the Ajax handlers from > prototype.js will replace the innerHTML member of that <div > id=''refresh_me''> with the new version. > > (Question for the lifers - is it _really_ "almost anything"? Or is it > "anything"!?)I haven''t come across anything that I couldn''t send back yet...> This does not work, however, it just reloads the entire page within the > list. Does anyone have any other ideas or sugestions. I realize that I > am probably implementing the above code wrong, but I have tried every > way that I can think of. Thanks,What does your link_to_remote look like? It should just update the ''refresh_me'' div with the result of the partial ''my_partial''. Also, if you want to delete an item, another idea would be to assign each item it''s own id. Say <div id=''my_item_123''>This is item 123</div> ... Then in your delete action (or link to method for that action in a callback on success) use an event to simply remove that element from the page. Then nothing has to update, and the item simply goes away after deleting it. -philip --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
> It looks like this. ''hotel_info-refresh'' is the name of the div and > ''delete_hotel_info'' is the name of the method that does the destroy. I > will try giving each item an id. > <%= link_to_remote ''Delete'', :update => ''hotel_info_refresh'', :action => > ''delete_hotel_info'', :id => @user.id %>Did you just mis-type the dash vs underscore in your div id and the value of :update? Otherwise it looks okay to me. Oh Wait! If you''re passing in :update, you don''t need to do a page.replace_html in your action. Just render the partial with :layout => false. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
I had to place the :action is side the :url as well as the the parameters that I was passing. After I did that everything worked fine. link_to_remote ''Delete'', :url => { :action => ''delete_hotel_info'', :id => @user.id, :hotel => @hotel.id }, :update => ''hotel_info_refresh'' Thanks Philip -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---