Rails :: Garantizar que un “action” solo responda a requerimientos Ajax
Publicado por Edgar González 27 Junio 2006 en Rails, Ruby.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:
-
<h2><%= h(_('My Blogs')) %></h2>
-
<% unless @blogs.empty? %>
-
<dl class='normal standard'>
-
<% for b in @blogs -%>
-
<dt id='dt<%= b.id %>'><%= h((b.url)) %></dt>
-
<dd id='dd<%= b.id %>'>
-
<%= link_to_remote h(_('delete')),
-
:url=>{ :controller=>'blogs',
-
:action=>'delete',
-
:id=>b.id},
-
:loading=>"Element.show('spinner#{b.id}')"
-
%>
-
<%= image_tag "ajax-loader-small.gif", :id => 'spinner'+b.id.to_s, :style => 'display:none; vertical-align: bottom;' %>
-
</dd>
-
<% end -%>
-
</dl>
-
<% 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:
-
def delete
-
unless request.xhr?
-
render :file => "#{RAILS_ROOT}/public/404.html", :status => "404 Not Found"
-
return
-
end
-
@blog = Blog.find(params[:id])
-
raise NotAuthorizedError unless @blog.user_id == current_user.id
-
@blog.destroy
-
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:
-
def test_delete_should_be_ajax
-
assert_not_nil Blog.find(1)
-
login_as :quentin
-
post :delete, :id => 1
-
assert_response(404)
-
assert_not_nil Blog.find(1)
-
login_as :quentin
-
get :delete, :id => 1
-
assert_response(404)
-
assert_not_nil Blog.find(1)
-
xhr :get, :delete, :id => 1
-
assert_response :success
-
assert_raise(ActiveRecord::RecordNotFound) {
-
Blog.find(1)
-
}
-
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.
muy buen post. Te felicito!!!!!!!, me fue de mucha utilidad :)