2009-07-07 13 views
5

Dobrze, z tego co przeczytałem na innych stronach internetowych i na przepełnieniu stosu, Railsy zgłaszają błąd tokenu uwierzytelniania, ponieważ mój formularz nie przekazuje tokena - i jest to funkcja bezpieczeństwa. Rozumiem to.Szyny Auth Token i Ajax

Jednak tak naprawdę nie mam formularza. Mam tutaj ajax - moje javascript umieszcza id'ed informacje w funkcji przetwarzania.

Moje pytanie brzmi: w jaki sposób uzyskać token uwierzytelniania do kontrolera?

Moim zdaniem wygląda to tak:

<% 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 %> 

Odpowiedni ajax jest następujący:

/* 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; 
}); 

Moja logika przetwarzania w sterowniku wygląda

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 

i wreszcie konsoli mówi:

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' 

Byłoby bardzo pomocne, gdyby ktoś mógł mi powiedzieć, gdzie się źle dzieje.

Odpowiedz

6

Rozwiązany! zmienił AJAX

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

I dodałem do głowy na każdej stronie

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

Witryna henrik.nyh.se wydaje się być wyłączony. Wersja zawiera również błąd, który zamienia żądanie pobierania na żądanie pocztowe za pomocą Internet Explorera. Ta poprawiona wersja pochodzi z: 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); 
}); 
Powiązane problemy