Link as a link AND as a function

Hi there,

I am relatively new to Rails and I am trying to do a fairly common task. I have a page that displays a series of links that go to offsite URLS. Next to each link is a counter that shows how many times that link has been clicked-through. I would like to be able to have the user click on a the link, be directed to the links address, AND at the same time, have a function create and add a "click-through" to the "clicks" database.

I was reading about the link_to_function helper but that doesn't seem to be quite what I want, but then again, I may not be understanding it completely.

Does anyone have any method for doing anything similar in their apps? I would love an help or advice.

Thank you in advance.

Quoting Michael Murillo <lists@ruby-forum.com>:

Hi there,

I am relatively new to Rails and I am trying to do a fairly common task. I have a page that displays a series of links that go to offsite URLS. Next to each link is a counter that shows how many times that link has been clicked-through. I would like to be able to have the user click on a the link, be directed to the links address, AND at the same time, have a function create and add a "click-through" to the "clicks" database.

I was reading about the link_to_function helper but that doesn't seem to be quite what I want, but then again, I may not be understanding it completely.

Link to a function like the following. It makes a GET request to the server and opens a new window to the url. The link_to also follows.

HTH,   Jeffrey

<%= link_to_function truncate(article.title, 60),     "clickThru('#{article.url}','#{article[:id]}', 'click')",     :title => article.feed.title, :href => article[:id] %>

function clickThru(url, id, verb) {   new Ajax.Request('/articles/'+id+'/'+verb,         {asynchronous:true, evalScripts:true, method:'get'});   window.open(url); }

Jeffrey L. Taylor wrote:

Quoting Michael Murillo <lists@ruby-forum.com>: <%= link_to_function truncate(article.title, 60),     "clickThru('#{article.url}','#{article[:id]}', 'click')",     :title => article.feed.title, :href => article[:id] %>

function clickThru(url, id, verb) {   new Ajax.Request('/articles/'+id+'/'+verb,         {asynchronous:true, evalScripts:true, method:'get'});   window.open(url); }

Thank you Jeffrey. I played around with it a bit and was wondering how the function intends to post to the clicks database. Is it by using that "id" => "click"? Or does "click" in your example refer to a method in a controller?

Thanks again Jeffrey.

Quoting Michael Murillo <lists@ruby-forum.com>:

Jeffrey L. Taylor wrote: > Quoting Michael Murillo <lists@ruby-forum.com>: > <%= link_to_function truncate(article.title, 60), > "clickThru('#{article.url}','#{article[:id]}', 'click')", > :title => article.feed.title, :href => article[:id] %> > > > function clickThru(url, id, verb) { > new Ajax.Request('/articles/'+id+'/'+verb, > {asynchronous:true, evalScripts:true, method:'get'}); > window.open(url); > }

Thank you Jeffrey. I played around with it a bit and was wondering how the function intends to post to the clicks database. Is it by using that "id" => "click"? Or does "click" in your example refer to a method in a controller?

Sorry for the slow reply. I have been at SxSW Interactive for the last 5 days.

This code is copied from my app, it will need some editing for your app. Ajax.request() is in the Prototype Javascript library, it makes a request to the server. The first parameter is the URL to call, the rest is copied from the code generated by link_to_remote. evalScripts:true indicates Javascript is expected in the reply and should be evaluated, method:'get' indicates to make a HTTP GET request instead of the default POST. The action on the server calls the model(s) to update the database.

HTH,   Jeffrey

Gotcha! Perfect. Thank you Jeffrey.

I got it to work with the following.

In my view:

<%= link_to_function truncate(link.name, 60), "clickThru('#{link.link}','#{link[:id]}', 'votes')", :title => link.name, :href => link.link %>

In my application.js

function clickThru(url, id, verb) {   new Ajax.Request('/links/'+id+'/'+verb,         {asynchronous:true, evalScripts:true, method:'post'});   window.open(url); }

Thank you so much! This was awesome and your advise came at the end of maybe 5 hours of internet searching.