katie
katie

Reputation: 2951

values are not saved in session array

In my controller action i initialize a session of array and inserting values. These values are coming from the client side through ajax, so the page is not refreshed while inserting these values to an array.But suprisingly every time it iniatialize a new session instead of inserting to the same defined session. Here is my code

controller

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

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),
    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!!!!');
    }
});

Upvotes: 0

Views: 1672

Answers (2)

katie
katie

Reputation: 2951

Finally i figured it out, The problem is i wasn't setting the request header for the token before sending ajax call so Rails was receiving data without the token, thus kept assuming it is a new object for every request.You can read more here.To set the request header add

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

Below is my ajax function that works

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!!!!');
 }
});

Upvotes: 1

Scott S
Scott S

Reputation: 2746

This sounds like the browser isn't saving cookies, which would explain the behavior you are seeing where the session is reinitialized every time. To confirm this, you can do

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

in your action and see if the session id changes for each request. If it does, check your browser privacy settings and see if it is saving any cookies.

Upvotes: 1

Related Questions