Supongamos que tenemos un controller que maneja una lista de items (digamos blogs), y queremos que la eliminación de los blogs solamente se haga vía Ajax. Primero usamos en el view de la lista usamos el ya "clásico" link_to_remote para invocar vía Ajax al action de eliminación en el controller, algo de esta forma:

RUBY:
  1. <h2><%= h(_('My Blogs')) %></h2>
  2. <% unless @blogs.empty? %>
  3.   <dl class='normal standard'>
  4.   <% for b in @blogs -%>
  5.     <dt id='dt<%= b.id %>'><%= h((b.url)) %></dt>
  6.     <dd id='dd<%= b.id %>'>
  7.       <%= link_to_remote h(_('delete')),
  8.                     :url=>{ :controller=>'blogs',
  9.                     :action=>'delete',
  10.                     :id=>b.id},
  11.                     :loading=>"Element.show('spinner#{b.id}')"
  12.         %>
  13.         <%= image_tag "ajax-loader-small.gif", :id => 'spinner'+b.id.to_s, :style => 'display:none; vertical-align: bottom;' %>
  14.     </dd>
  15.   <% end -%>
  16.   </dl>
  17. <% end %>

Ahora queremos que nuestro controller solo responda a requerimientos Ajax, para garantizar esto usamos el método xhr?, un ejemplo sería algo como esto:

RUBY:
  1. def delete
  2.   unless request.xhr?
  3.     render :file => "#{RAILS_ROOT}/public/404.html", :status => "404 Not Found"
  4.     return
  5.   end
  6.   @blog = Blog.find(params[:id])
  7.   raise NotAuthorizedError unless @blog.user_id == current_user.id
  8.   @blog.destroy
  9. end

Es decir, si el requerimiento no es vía XMLHttpRequest el action devuelve el código de error HTTP 404 (Not Found).

Y como los test son vida :-), nuestro test funcional podría ser algo como:

RUBY:
  1. def test_delete_should_be_ajax
  2.   assert_not_nil Blog.find(1)
  3.   login_as :quentin
  4.   post :delete, :id => 1
  5.   assert_response(404)
  6.   assert_not_nil Blog.find(1)
  7.   login_as :quentin
  8.   get :delete, :id => 1
  9.   assert_response(404)
  10.   assert_not_nil Blog.find(1)
  11.   xhr :get, :delete, :id => 1
  12.   assert_response :success
  13.   assert_raise(ActiveRecord::RecordNotFound) {
  14.     Blog.find(1)
  15.   }
  16. end

Con lo cual probamos que un requerimiento que no sea vía XMLHttpRequest (un post o get directo) devuelve un 404. Y para probar que el action si responde adecuadamente a un requerimiento vía XMLHttpRequest usamos el método xhr.


1 Respuesta a “Rails :: Garantizar que un “action” solo responda a requerimientos Ajax”

  1. 1 seba

    muy buen post. Te felicito!!!!!!!, me fue de mucha utilidad :)


RSS feeds

Suscríbete a nuestros RSS Feeds