2012-12-07 48 views
0

在我的控制器操作中,我初始化一個數組的會話並插入值。這些值是通過ajax從客戶端獲得的,因此在將這些值插入到數組中時不會刷新頁面。但令人驚訝的是,每次它都會初始化新會話而不是插入到相同的已定義會話中。這裏是我的代碼值不保存在會話數組中

控制器

def receive_tags 
    parser = Yajl::Parser.new 
    @hash = parser.parse(request.body.read) 
    log=Logger.new(STDOUT) 
    log.error(@hash) 
    session[:tags]||=[] 
    session[:tags] << @hash["tag"] 
    unless session[:tags].empty? 
    log.error(session[:tags]) #this keeps printing the current value i was expecting it to print a list of values including the previous 
    end 
    render :nothing=>true 
end 

阿賈克斯

var myobj={tag:"mytag"}; 
$.ajax({ 
    url: 'ips/receive_tags', 
    type: 'post', 
    contentType: 'application/json; charset=UTF-8', 
    accept: 'application/json', 
    dataType: 'json', 
    data:JSON.stringify(myobj), 
    success: function(res) { 
     if (res.ImportResponse !== void 0) { 
      console.log('Success: ' + res); 
     } else if (res.Fault !== void 0) { 
      console.log('Fault: ' + res); 
     } 
    }, 
    error: function() { 
     console.error('error!!!!'); 
    } 
}); 
+0

請縮進代碼。沒有人希望讀取不帶有縮進的代碼。 – meagar

回答

1

最後我想通了,問題是我沒有在發送ajax調用之前設置令牌的請求頭,所以Rails在沒有令牌的情況下接收數據,因此一直假定它是每個請求的新對象。可以閱讀更多here。要設置請求頭添加

beforeSend: function(xhr) { 
xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')); 
} 

下面是我的AJAX功能的作品

var myobj={tag:"mytag"}; 
$.ajax({ 
url: 'ips/receive_tags', 
type: 'post', 
contentType: 'application/json; charset=UTF-8', 
accept: 'application/json', 
dataType: 'json', 
data:JSON.stringify(myobj), 
beforeSend: function(xhr) { 
xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')); 
} 
success: function(res) { 
    if (res.ImportResponse !== void 0) { 
     console.log('Success: ' + res); 
    } else if (res.Fault !== void 0) { 
     console.log('Fault: ' + res); 
    } 
}, 
error: function() { 
    console.error('error!!!!'); 
} 
}); 
+0

有趣。我從來沒有遇到過這個問題,但需要牢記。真高興你做到了。 –

1

這聽起來像是瀏覽器未保存的cookies,這可以解釋你看到其中會話重新初始化,每次的行爲。要確認這一點,您可以在您的操作中執行

print "Session ID: #{request.session_options[:id]}" 

並查看會話ID是否爲每個請求更改。如果確實如此,請檢查您的瀏覽器隱私設置並查看它是否保存了任何Cookie。

+0

會話ID不斷變化,它打印出特定的當前值 – katie

+0

而我只是檢查了我的瀏覽器設置,它確實保存了Cookie,我使用的是Firefox,它說'Firefox會記住歷史記錄'。你試着在你的環境中看看它是否爲你工作? – katie

+0

是的''session [:spike] || = []' 'session [:spike] << params [:spike_param]'對我很好 - 它完全按照預期追加'params [:spike_param]'。您可以嘗試不同的瀏覽器,或者轉到Firefox首選項>隱私,然後單擊刪除單個Cookie。如果您在這裏搜索「localhost」,則應該爲您的應用程序提供一個。 –