action_cacheing

Hey

Henrik Jensen wrote:

I'm playing with caching, and since my site contians a "login and register" link, which only should be shown when the user isn't logged in, page-caching is not an option :confused:   

I thought the same thing a while ago, but then I played around with it a bit and eventually javascript semi-solved the problem.

By saving an additional cookie in users' browser - one which only existed while they were logged in - I used javascript to check for it (findiing it meaning they were logged in) and changing tiny bits of my layout, eg the login link to a logout link if the cookie existed.

Here's the code:

In the view:

<%= link_to 'login', '/login', :id => 'login_link' %>

<%= update_page_tag do |page|   exec_this = "   if (getCookie('logged_in')   {     $('login_link').href = '/logout';     $('login_link').innerHTML = 'logout';"   }"

  page << exec_this

end %>

The javascript looks as follows and I got it from a website sometime, I think...so kudos to whoever wrote it! I think it returns the actual value of the cookie, so you can use that if you'd like.

Just put this in your application.js, or in <script> tags...

//************************************************************* function getCookie(name) {   var dc = document.cookie;   var prefix = name + "=";   var begin = dc.indexOf("; " + prefix);   if (begin == -1) {     begin = dc.indexOf(prefix);     if (begin != 0) return null;   } else     begin += 2;   var end = document.cookie.indexOf(";", begin);   if (end == -1)     end = dc.length;   return unescape(dc.substring(begin + prefix.length, end)); } //*************************************************************

but what about action-caching? the to links are placed in layout/application.rhtml, but they are still being cached :confused: shouldn't caches_action only cache the output of the action i use i on

I don't think this'll work for very large modifications, but if the only thing holding you back from page caching is one or two <a>'s, give this a shot and see if it works for you...

Hope you find this useful!

Cheery-o! Gustav Paul gustav@rails.co.za

Henrik Jensen wrote:

By saving an additional cookie in users' browser - one which only existed while they were logged in - I used javascript to check for it (findiing it meaning they were logged in) and changing tiny bits of my layout, eg the login link to a logout link if the cookie existed.      I guess that would work - however I have to admit it's ugly, and I would prefer not to use it :slight_smile:

Is there really no other way to only catch the returnvalue of an action?

Lol, I preferred not to use it either in the end :slight_smile:

Nope, I don't know of any other way. This bugged me as well, but I couldn't find any other way :frowning:

Sorry man, Gustav Paul gustav@rails.co.za

You might be better served with the action_cache plugin, http://agilewebdevelopment.com/plugins/action_cache, which can use any variables available to the app (such as logged-in status) to create alternate cached versions of the same action.