thoughtpunch
thoughtpunch

Reputation: 1937

Rails 3: How to tell if a user has visited a page before?

I have a Rails app (using Authlogic for authentication) with a simple jquery animation that I only want to run once upon first page load. I know that the key is to check cookies or something to see if the user has visited the page before. Please forgive my n00bness, I know little to nothing about HTTP cookies or sessions.

So, what's the best way to see if a visiting user (even if they haven't logged in) is viewing a page for the first time?

EDIT: Ok, so I realize I wasn't being entirely clear.

I've spent hours looking at similar questions and reading the Rails API Docs for cookies and sessions and I still can't visualize how to implement a visited? function for each page in my site that will only be set to "true" after the user has visited the page the first time. I looked at the supposed "duplicate" question Rails Detect If User's Very First Visit and the respective answers and still can't figure it out.

Here's my "Pages" controller:

def home
    @title = "Home"
end

def contact
    @title = "Contact Us"
end

dd

And my jquery javascript that does a simple animation:

$(document).ready(function() 
 {
if (!$.cookie('visited')) {
    $('.title .flying-text').css({opacity:0});
    $('.title .active-text').animate({
        opacity:1,
        marginTop: "-150px",
        }, 5000);
}
 });

I only want it to show if the user HAS NOT visited the page before. I have no idea how to properly set a cookie in Rails, nor where to put it, nor how to make sure that the animation script can access that exact same cookie value. Can someone give me a hand?

~Dan

Upvotes: 4

Views: 4273

Answers (2)

mark
mark

Reputation: 10564

You can set a cookie like this:

cookies[:welcomed] = {:value => true, :expires => Time.now + 6.months}

and from jquery make a wee function

function readCookie(name) {
    var nameEQ = name + "=", ca = document.cookie.split(';');
    for (var i = 0; i < ca.length; i += 1) {
        var c = ca[i];
        while (c.charAt(0) === ' ') { 
            c = c.substring(1, c.length);
        }
        if (c.indexOf(nameEQ) === 0) {
            return c.substring(nameEQ.length, c.length);
        }
    }
    return null;
}

and call it #in js

  if (readCookie('welcomed') == null){}

Upvotes: 4

Dominic
Dominic

Reputation: 3304

Ignore the cookie from Javascript.

Using the question referenced as a duplicate, use a permanent cooke and on the first run, set a class on your body from Rails (let's say first-run). Then, have your javascript check and see if body has class first-run. At that point, you can have javascript execute it's first run code.

Upvotes: 3

Related Questions