views:

41

answers:

1

I'm planning on using Bit.ly Pro and the Bit.ly API to make my own short urls in a Rails 3 project.

I've got a User and a Note model. And a url structure like this: '/username/1-note-title'.

Now I would like to give each note a short url. But I don't know from where I should do the API call. Right now I got this code in the Note controller but I don't know if that's the right place or how to get the url of the specific note...

url = ???

parsed_json = JSON('http://api.bit.ly/v3/shorten?login=bitlyapidemo&apiKey=R_0da49e0a9118ff35f52f629d2d71bf07&longUrl=' + url + '&format=json')

@short_url = parsed_json["data"]["url"]

The JSON object structure just for reference:

{
  "status_code": 200, 
  "data": {
    "url": "http://bit.ly/cmeH01", 
    "hash": "cmeH01", 
    "global_hash": "1YKMfY", 
    "long_url": "http://betaworks.com/", 
    "new_hash": 0
  }, 
"status_txt": "OK"
}

Help wanted, thanks in advance!

+2  A: 

I seems that the short url should get created when a new note is created for a given user. In that context it would happen as the result of a create action in the NotesController (typically). Best practice would suggest that the logical responsibility should live the Note model so I would suggest you do the bit.ly shortening implemented in a save callback, either before or after, depending on how critical it is (in the context of your particular app) for a shortened URL to exist.

The challenge is do deal with the error case which is when the bit.ly service is unable to respond to your shortening request at all or is taking too long in so doing. That's when putting it in the callback may not make sense as it could potentially tie up your application when trying to fulfill the request.

If you don't need live URL shortening then you could consider creating shortening requests as queued jobs in a background process to be done asynchronously (retrying as necessary) and be triggered in the aforementioned after_save callback in your Note model

bjg
Thanks, do you know if the after_save callback works on both creates and updates?
Alfred Nerstu
@Alfred Nerstu Yes is does. Quoting from the documentation (http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html#M001373): "after_save() ... Is called after Base.save (regardless of whether it‘s a create or update save). "
bjg
Ahh, that's great, thanks!
Alfred Nerstu