link_to_remote("Destroy", :url => {:action => 'destroy', :id => item},
:confirm => "Are you sure?"
link_to_function "Cancel", "$('create_form').hide();"
link_to_function "Cancel" do |page|
page[object.dom_id("rate_link")].show
page[object.dom_id("rate")].hide
end
<% form_remote_tag :url => {:action => 'update'} do %>
<%= hidden_field_tag "prompt[id]", @prompt.id %>
<%= render :partial => 'form', :locals => {:mode => 'edit'} %>
<%= submit_tag "Edit" %>
<% end %>
# In your .rhtml view:
<% form_remote_tag
:url => {:controller => "comments", :action => "create", :id => user},
:html => { :id => "comment_form"},
:before => "$('spinner').show()",
:complete => "$('spinner').hide()" do %>
<%= text_area "comment", "body", :cols => 80 %><br/>
<%= submit_tag 'Submit' %>
<% end %>
# The form tag generated by form_remote_tag:
<form action="/comments/create/1" id="comment_form" method="post"
onsubmit="$('spinner').show(); new Ajax.Request(...">
def create
@comment = Comment.new(params[:comment])
if @comment.save
render :update do |page|
page.insert_html :bottom, 'comment_list', :partial => 'comment'
page.visual_effect :highlight, @comment.dom_id
page['comment_form'].reset
end
else
render :update do |page|
page.alert @comment.errors.full_messages.join("\n")
end
end
end
# In your .html.erb view:
<%= link_to_remote "Delete", :url => {:action => 'destroy', :id => comment},
:confirm => "Are you sure you want to delete your comment?",
:update => comment.dom_id %>
</div>
# In the controller
def destroy
@comment = Comment.find(params[:id])
assert_authorized
@comment.destroy
render :text => ''
end
# Callbacks: :before # before request is initiated and before request object is created :after # request object's open method has not been called yet :loading # request has not been sent yet :loaded # request has been initiated :interactive # response is being received :success # response is ready and in 200 range :failure # response is ready and is not in 200 range :complete # response is ready # Other options :submit # id of a form to submit, can also be just a div with form elements :confirm # JavaScript confirm dialog before request :condition # JavaScript expression that must be true for request to happen
$A(document.getElementsByTagName('a')).first()
$H({'ren':'happy', 'stimpy':'joy'}).keys()
$('some_id').hide()|show() # instead of document.getElementById('some_id')
$F('login') # The value of field input login
$$('div#footer').invoke('hide') # CSS selector
$$('a').each( function(element) { element.hide() })
# In index.rhtml:
<% form_remote_tag :url => { :action => :add_to_cart, :id => product } do %>
<%= submit_tag "Add to Cart" %>
<% end %>
# The action:
def add_to_cart
product = Product.find(params[:id])
@current_item = @cart.add_product(product)
redirect_to_index unless request.xhr?
end
# The RJS template add_to_cart.js.rjs:
page.select("div#notice").each { |div| div.hide }
page.replace_html("cart", :partial => "cart", :object => @cart)
page[:cart].visual_effect :blind_down if @cart.total_items == 1
page[:current_item].visual_effect :highlight, :startcolor => "#88ff88", :endcolor => "#114411"
# Position argument is one of :before, :top, :bottom, :after
page.insert_html :bottom 'todo_list', "<li>#{todo.name}</li>"
page.replace_html 'flash_notice', "Todo added: #{todo_name}"
page.replace 'flash_notice', :partial => 'flash', :object => todo
page[:flash_notice].remove|show|hide|toggle # page[:flash_notice] <=> $('flash_notice')
page.alert "The form contains the following errors: #{errors.join(“, “)}"
page.redirect_to :controller => 'blog', :action => 'list'
# Available effects: :fade, :appear, :blind_up/down,
# :slide_up/down, :highlight, :shake, :pulsate, etc.
page.visual_effect :pulsate, 'flash_notice'
page.delay(3) do
page.visual_effect :fade, 'flash_notice'
end
page.select('p.welcome b').first.hide
page.select('#items li').each do |value|
value.hide
end
<%= observe_form('search_form',
:url => {:action => 'search_count'},
:frequency => 3,
:condition => (@model_name == 'Contact' ?
"!$('search_form').submitting && !contact_search_form_empty()" :
"!$('search_form').submitting && !outlet_search_form_empty()"),
:with => "search_form",
:loading => "$('spinner').show();",
:complete => "$('spinner').hide();") %>
<%= observe_field("show_hide_select",
:url => { :action => 'toggle_column', :item_count => item_count },
:with => "'column_name=' + value") %>
# Spinning icon that is displayed when an AJAX request is in progress <img class="spinner" id="ajax_spinner" src="/images/spinner.gif" alt="Comment being processed" style="display: none" />
# In public/javascripts/application.js. Will show the spinner whenever
# an AJAX request is in process.
Ajax.Responders.register({
onCreate: function(){
$('spinner').show();
},
onComplete: function() {
if(Ajax.activeRequestCount == 0)
$('spinner').hide();
}
});
# This example is about dragging books in list to a shopping cart in the menu bar.
<li class="book" id="book_<%= book.id %>">
...book info here...
</li>
<%= draggable_element("book_#{book.id}", :revert => true) %>
<div id="shopping_cart">
<%= render :partial => "cart/cart" %>
</div>
<%= drop_receiving_element("shopping_cart", :url => { :controller => "cart", :action => "add" }) %>
def add
params[:id].gsub!(/book_/, "")
@book = Book.find(params[:id])
@item = @cart.add(params[:id])
if request.xhr?
flash.now[:cart_notice] = "Added <em>#{@item.book.title}</em>"
render :action => "add_with_ajax"
elsif request.post?
flash[:cart_notice] = "Added <em>#{@item.book.title}</em>"
redirect_to :controller => "catalog"
end
end
# add_with_ajax.js.rjs:
page.replace_html "shopping_cart", :partial => "cart"
page.visual_effect :highlight, "cart_item_#{@item.book.id}", :duration => 3
page.visual_effect :fade, 'cart_notice', :duration => 3
# Installation script/plugin install git://github.com/rails/auto_complete.git # Controller class BlogController < ApplicationController auto_complete_for :post, :title end # View <%= text_field_with_auto_complete :post, title %>
# Installation script/plugin install git://github.com/rails/in_place_editing.git # Controller. Warning: does not do validation. class BlogController < ApplicationController in_place_edit_for :post, :title end # View <%= in_place_editor_field :post, 'title' %>
module ApplicationHelper
def replace_article(article)
update_page do |page|
page[:article].replace partial => :article, :locals => {:article => article}
end
end
end
# In the controller action
render :update do |page|
page << replace_article(@article)
page.highlight :article
end
Firebug and the Web Developer Extension for Firefox are great tools when working with AJAX. You can use Firebug Lite in other browsers (i.e. IE on windows).