Search code examples
ruby-on-railsrubypassengerwebricklast.fm

Rails3 helpers and dynamic content


I've been working to pull dynamic data from last.fm using youpy's "lastfm" gem. Getting the data works great; however, rails doesn't seem to like the dynamic portion. Right now, I have added the code to a helper module called "HomeHelper" (generated during the creation of the rails app) found in the helper folder:

module HomeHelper

@@lastfm = Lastfm.new(key, secret)
@@wesRecent = @@lastfm.user.get_recent_tracks(:user => 'weskey5644')    

def _album_art_helper

    trackHash = @@wesRecent[0]
    medAlbumArt = trackHash["image"][3]

    if medAlbumArt["content"] == nil
        html = "<img src=\"/images/noArt.png\"  height=\"auto\" width=\"150\" />"
    else
        html = "<img src=#{medAlbumArt["content"]} height=\"auto\" width=\"150\" />"
    end

    html.html_safe

end

def _recent_tracks_helper

    lfartist1 = @@wesRecent[0]["artist"]["content"]
    lftrack1 = @@wesRecent[0]["name"]
    lfartist1 = @@wesRecent[1]["artist"]["content"]
    lftrack1 = @@wesRecent[1]["name"]

    htmltrack = "<div class=\"lastfm_recent_tracks\">
                <div class=\"lastfm_artist\"><p>#{lfartist1 = @@wesRecent[0]["artist"]["content"]}</p></div>
                <div class=\"lastfm_trackname\"><p>#{lftrack1 = @@wesRecent[0]["name"]}</p></div>
                <div class=\"lastfm_artist\"><p>#{lfartist2 = @@wesRecent[1]["artist"]["content"]}</p></div>
                <div class=\"lastfm_trackname\"><p>#{lftrack2 = @@wesRecent[1]["name"]}</p></div>
            </div>
    "       

    htmltrack.html_safe
end
end

I created a partial for each and added them to my Index page:

<div class="album_art"><%= render "album_art" %></div>
<div id="nowplayingcontain"><%= render "recent_tracks" %></div>

Great, this gets the data I need and displays on the page like I want; however, it seems that when the song changes, according to last.fm, it doesn't on my site unless I restart the server.

I've tested this using Phusion Gassenger and also WEBrick and it seems to do it on both. I had thought this might be an issue with caching of this particular page so I tried a couple of caching hacks to expire the page an reload. This didn't help.

I then came to conclusion that sticking this code in a helper file might not be the best solution. I don't know how well helpers handle dynamic content; such as this. If anyone has any insight on this, awesome!! Thanks everyone!


Solution

  • Your problem isn't that you're using a helper, the problem is that you're using class variables:

    module HomeHelper
        @@lastfm = Lastfm.new(key, secret)
        @@wesRecent = @@lastfm.user.get_recent_tracks(:user => 'weskey5644')
    

    that are initialized when the module is first read. In particular, @@wesRecent will be initialized once and then it will stay the same until you restart the server or happen to get a new server process. You should be able to call get_recent_tracks when you need it:

    def _album_art_helper
        trackHash = @@lastfm.user.get_recent_tracks(:user => 'weskey5644').first
        #...
    

    Note that this means that your two helpers won't necessarily be using the same track list.

    You might want to add a bit of "only refresh the tracks at most once very minute" logic as well.