2009-04-08 10 views
13

benim Raylar sitedeki bir ajax arama yapma bazı javascript var. Mümkünse, protect_from_forgery öğelerini orada tutmak isterim ... Ama bir javascript dosyasından auth jetonunu nasıl geçebilirim?protect_from_forgery & Unobtrusive JavaScript

Herkes bana yardımcı olabilir mi? senin düzende

cevap

21

, başka herhangi bir JS önce bu eklentiyi çalıştırır: o yanlışlıkla diğer JavaScript ile üzerine yazılır az olası olacak şekilde

<script> 
    function authToken() { 
    return '<%= form_authenticity_token if protect_against_forgery? -%>'; 
    } 
</script> 

authToken bir fonksiyonu olarak kodlanmıştır.

Alternatif olarak, Rails 3 itibariyle doğrulama anahtarı sizinle okuyabilir bir <meta> etiketi olarak gömülür: ana JS

<script> 
    function authToken() { 
    return $('meta[name="csrf-token"]').attr('content'); 
    } 
</script> 

, daha sonra authToken() çağırabilir ve bu dönersiniz Ajax çağrılarınıza dahil etmek için bir kimlik olarak orijinallik belirteciniz. Örneğin, jQuery kullanarak: Eğer form_for yardımcı yerleşik Raylar kullanırsanız, otomatik olarak gizli bir girişteki özgünlük belirteci eklediği

$.ajax({ 
    type: 'PUT', 
    url: url, 
    data: { 
    foo: bar, 
    authenticity_token: authToken() 
    }, 
    complete: function(data) {} 
}); 

Not. Eğer gizli kimlik doğrulama belirteci dahil formun tüm verileri göndermek istiyorsanız, sadece kullanabilirsiniz:

var $form = $('form'); 
$.ajax({ 
    url:  $form.attr('action'), 
    type:  $form.attr('method'), 
       // "get" or "post"; overridden by Rails' hidden "_method" 
       // input value, e.g., "put" 
    data:  $form.serialize(), 
       // Includes hidden "authenticity_token" and "_method" inputs 
    complete: function(data) {} 
}); 

Bu desen zaten JS olmadan çalışır bir form yazdım çoğu zaman yararlıdır ve' formun verilerini Ajax üzerinden gönderen göze batmayan bir JS katmanı ekleyerek.

+0

Harika, teşekkürler ton! Bir çekicilik gibi çalıştı. –

3

Yukarıdaki çözüm için teşekkürler.
Sitemde, form_tag raylarını kullanmayan bazı standart formlar kullanıyorum, bunun yerine bunu gizli bir form öğesi olarak ekledim.

<form action="..."> 
    <%= hidden_field_tag 'authenticity_token', form_authenticity_token if protect_against_forgery? %> 
    ... rest of form... 
</form> 

Bir işlem yapar.