2009-07-07 28 views
5

Bien, por lo que he leído en otros sitios web y en desbordamiento de pila, Rails arroja este error de token de autenticación porque mi formulario no pasa el token, y es una característica de seguridad. Esto lo entiendoRails Auth Token y Ajax

Sin embargo, realmente no tengo un formulario. Tengo ajax aquí - mi javascript publica la información identificada en una función de procesamiento.

Así que mi pregunta es, ¿cómo obtengo el token de autenticación en mi controlador?

Mi punto de vista es el siguiente:

<% for transaction in @transactions %> 
     <% if transaction["category"] == '' %> 
     <% transaction["category"] = "Uncategorized" %> 
         <% end %> 

         <tr title = "<% if params[:type] %><%= params[:type] %><% else %>Purchases<% end %> <%= transaction["id"] %>" > 

          <td class="check"><a class="help" href="#"><img src="/images/icons/help.png" alt="?" /></a><input type="checkbox" /></td> 
          <td class="date"><% if transaction["date"] != "0000-00-00 00:00:00" %><%= transaction["date"].to_date.strftime("%B %d") %><% end %></td> 

          <% if params[:type] == "Bills" || params[:type] == "Reimbursements" %> 
          <td class="payee"><%= transaction["payee"] %></td> 
          <td class="details"><%= transaction["details"] %></td> 
          <% else %> 
          <td class="description"><% if transaction["detail"] == "undefined" %>n/a<% else %><%= transaction["detail"] %><% end %></td> 
          <td class="category">n/a</td> 
          <% end %> 

          <td class="amount">-$<%= transaction["amount"] %></td> 
         </tr> 

        <% end %> 

El Ajax correspondiente es como sigue:

/* send ids by ajax */ 
$('#tableActions li a').click(function() { 
    if(!$(this).hasClass('disabled')) { 
     action = $(this).text(); 
     ids = new Array(); 
     i = 0; 
     $('td.check input','#tableHolder').each(function() { if($(this).attr('checked')) { ids[i++] = $(this).parents('tr').attr('title'); } }); 
     $.ajax({ 
      type: "POST", 
      url: "/bulkaction", 
      data: "=" + action + "&ids=" + ids + "&authenticity_token=" + encodeURIComponent(AUTH_TOKEN), 
      success: function(data){ 
       $('#tableHolder').html(data); 
       /* bring back all functionality */ 
       initTable(); 
       /* set default sorting by date desc */ 
       $('th').removeClass('sortUp sortDown'); 
       $('th:eq(1)').addClass('sortDown'); 
       /* disable all actions */ 
       $('#tableActions li a').addClass('disabled'); 

      } 
     }); 
    } 
    return false; 
}); 

Mi lógica de procesamiento en el controlador parece

def bulkaction 
      if request.post? 
       ids = params[:ids] 
       #Need to create a function here to parse out my string 
       puts ids #for testing purposes, just put my ids onto the console 
      end 

puts "This function was accessed and ran." 
end 

Y finalmente la consola dice

Processing UserController#bulkaction (for ::ffff:xx.xxx.xxx.xxx at 2009-07-06 23                    :29:49) [POST] 
    Parameters: {"ids"=>"Purchases 10040963"} 

ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticit                    yToken): 
    /usr/local/lib/ruby/1.8/webrick/httpserver.rb:104:in `service' 
    /usr/local/lib/ruby/1.8/webrick/httpserver.rb:65:in `run' 
    /usr/local/lib/ruby/1.8/webrick/server.rb:173:in `start_thread' 
    /usr/local/lib/ruby/1.8/webrick/server.rb:162:in `start' 
    /usr/local/lib/ruby/1.8/webrick/server.rb:162:in `start_thread' 
    /usr/local/lib/ruby/1.8/webrick/server.rb:95:in `start' 
    /usr/local/lib/ruby/1.8/webrick/server.rb:92:in `each' 
    /usr/local/lib/ruby/1.8/webrick/server.rb:92:in `start' 
    /usr/local/lib/ruby/1.8/webrick/server.rb:23:in `start' 
    /usr/local/lib/ruby/1.8/webrick/server.rb:82:in `start' 

Sería muy útil si alguien pudiera decirme dónde me estaba yendo mal.

Respuesta

6

¡Resuelto! cambiado el Ajax a

data: "=" + action + "&ids=" + ids + "&authenticity_token=" + AUTH_TOKEN, 

Y añadí a la cabeza de cada página

<%= javascript_tag "const AUTH_TOKEN = #{form_authenticity_token.inspect};" if protect_against_forgery? %> 
1

El sitio de henrik.nyh.se parece estar abajo. La versión allí también contiene un error que convierte la solicitud get en una solicitud posterior con Internet Explorer. Esta versión fija es de: http://www.justinball.com/2009/07/08/jquery-ajax-get-in-firefox-post-in-internet-explorer/

jQuery(document).ajaxSend(function(event, request, settings) { 
    if (typeof(AUTH_TOKEN) == "undefined") return; 
    if (settings.type == 'GET') return; // Don't add anything to a get request let IE turn it into a POST. 
    settings.data = settings.data || ""; 
    settings.data += (settings.data ? "&" : "") + "authenticity_token=" + encodeURIComponent(AUTH_TOKEN); 
});