Graphs with Gruff (followup)


This post is by Daniel Wanja from onrails.org


Click here to view on the original site: Original Post




The solution from the source 😉 I checked it out and it now works as advertised, just add g.minimum_value = 0 to the Gruff::Bar before rendering it (g.to_blob).

Note that axis starting at zero.

Without the minimum_value With the minimum_value set to zero

time.onrails.org, time tracking made simple!


This post is by Daniel Wanja from onrails.org


Click here to view on the original site: Original Post




We call it time.onrails.org. It’s a new FREE online time tracking product for the consultant and programmer that bills by the hour or works on multiple projects.

We (Lee and I) have been using it for awhile now to track our Rails consulting work. It’s really the fastest way to count your hours across multiple projects. And we tried many of the solutions out there.

See time.onrails.org for an overview or go straight to signup and be up and running in 5 seconds.

Let us know what you think at time@onrails.org.

Enjoy!
Daniel

CSS Transparent Rollovers


This post is by Daniel Wanja from onrails.org


Click here to view on the original site: Original Post




I was trying to implement some rollover effects when I stumbled over this article at mandarindesign. I wrapped this functionality in the helper here after


Project Dashboard Charts
<%= rollover_image(‘/images/index/project_icon.png’, true) %> <%= rollover_image(‘/images/index/dashboard_icon.png’) %> <%= rollover_image(‘/images/index/graph_icon.png’) %>



def rollover_image(src, over=false)
transON, transOFF = over ? [‘transOFF’, ‘transON’] : [‘transON’, ‘transOFF’]
content_tag “div”,
image_tag(src, :onmouseover => “this.className=‘#{transOFF}’”, :onmouseout => “this.className=‘#{transON}’” ),
:class => transON,
:onmouseover => “this.className=‘#{transOFF}’”,
:onmouseout => “this.className=‘#{transON}’”
end

Project Dashboard Charts
Project_icon
Dashboard_icon
Graph_icon

SXSWi Why the Lucky Stiff – Ruby on Rails Podcast


This post is by Ruby on Rails Podcast from Ruby on Rails Podcast


Click here to view on the original site: Original Post




A bootleg of the Why the Lucky Stiff concert at the South by Southwest Interactive Festival.

SXSWi Why the Lucky Stiff – Ruby on Rails Podcast


This post is by Ruby on Rails Podcast from Ruby on Rails Podcast


Click here to view on the original site: Original Post




A bootleg of the Why the Lucky Stiff concert at the South by Southwest Interactive Festival.

SXSWi Shaun Inman – Ruby on Rails Podcast


This post is by Ruby on Rails Podcast from Ruby on Rails Podcast


Click here to view on the original site: Original Post




Popular designer and PHP developer Shaun Inman tries Ruby and talks about developing Mint.
See him in Boston next month at a Carson Workshops seminar on developing extensible PHP web apps.

SXSWi Shaun Inman – Ruby on Rails Podcast


This post is by Ruby on Rails Podcast from Ruby on Rails Podcast


Click here to view on the original site: Original Post




Popular designer and PHP developer Shaun Inman tries Ruby and talks about developing Mint.
See him in Boston next month at a Carson Workshops seminar on developing extensible PHP web apps.

Bruce Tate – Ruby on Rails Podcast


This post is by Ruby on Rails Podcast from Ruby on Rails Podcast


Click here to view on the original site: Original Post




Bruce Tate has created a stir in the Java community by promoting Ruby.
His books include Beyond Java and the upcoming Ruby on Rails, Up and Running.

Bruce Tate – Ruby on Rails Podcast


This post is by Ruby on Rails Podcast from Ruby on Rails Podcast


Click here to view on the original site: Original Post




Bruce Tate has created a stir in the Java community by promoting Ruby.
His books include Beyond Java and the upcoming Ruby on Rails, Up and Running.

Managing Rails Plugins dependencies


This post is by Daniel Wanja from onrails.org


Click here to view on the original site: Original Post




Rails has a nice plugin system allowing to add common code to a project. A plugin should really be independent from any other plugins. But we also use plugins to share code among different projects we are working on and our code depends on existing plugins. The Rails development team want’s to keep the plugin system simple and didn’t provide an explicit way to handle these dependencies, which I believe is a good decision. There is a solution. Simply name the plugins in order off the dependencies you have. Let’s assume you want to add “my_very_own_plugin” plugin that depends on the enumation_mixin, then simply organize the /vendor/plugins folder as follows, et Voila!:.

/myrailsapp
    /vendor
        /plugins
            /01_acts_as_taggable
            /01_enumations_mixin 
            /01_acts_as_versioned
            /02_my_very_own_plugin

If we look at the Rails::Initializer we can see why this works. Note, this is only an extract of the full class that Rails provides to bootstrap your rails applicaton. The sort on line 4 here after allows this trick.

module Rails
class Initializer
def load_plugins
find_plugins(configuration.plugin_paths).sort.each { |path| load_plugin path }
$LOAD_PATH.uniq!
end
end
end

Jim Weirich – Ruby on Rails Podcast


This post is by Ruby on Rails Podcast from Ruby on Rails Podcast


Click here to view on the original site: Original Post




The Ruby pioneer on rake task automation and good code design.

Jim Weirich – Ruby on Rails Podcast


This post is by Ruby on Rails Podcast from Ruby on Rails Podcast


Click here to view on the original site: Original Post




The Ruby pioneer on rake task automation and good code design.

A source code browser


This post is by Daniel Wanja from onrails.org


Click here to view on the original site: Original Post




Browse::Source is a simple source code browsing application. It’s 100% based on Collaboa, it’s mostly the source code browser functionality but uses the file system rather than connecting to subversion.

I recently got a request from Justin to have access to some ‘old’ rails code (flexonrails) we wrote a while ago, and also Todd asked for the source code of autumnriders.
So I tried Collaboa but it requires to compile subversion from the source in order to have swig-rb. So I extracted the source code browser from Collaboa and removed the dependency on swig-rb. Now if all you need is to add simple source code browsing…then Browse::Source is what you need.

Well, we haven’t posted yet the two code bases mentionned above, but have a look at the source code browser source code Browse::Source

Graphs with Gruff


This post is by Daniel Wanja from onrails.org


Click here to view on the original site: Original Post





class GraphController < BaseTimeController
def pages
g = Gruff::Pie.new(“500×350”)
g.title = “All Pages”
@current_user.pages.each do |page|
g.data(page.title, [page.total])
end
send_data(g.to_blob,
:disposition => ‘inline’,
:type => ‘image/png’,
:filename => “timers.png”)
end
end

Pretty easy! Wasn’t it. Note the code above shows only the first of the graphs. Now if only I could find out how to set the minimum of the Bar chart to 0 instead of the minimum of the serie. Any help is appreciated?

Auto-login


This post is by Daniel Wanja from onrails.org


Click here to view on the original site: Original Post




One of my midnight Rails projects is a “time tracking” application for which I needed auto-login. You know, the “Remember me” check box so that you don’t have to login each time you visit the application. I found a nice article written by Matt McCray describing how this was implemented for TaskThis.com at http://www.mattmccray.com/archives/category/software/rails/taskthis/. Even further he provides the full source code for the application. I didn’t take directly his auto_login.rb module but was greatly inspired by it. I also used the Login Engine Plugin that was not providing this feature, maybe this changed, so it could be simpler, but how simple implementing the auto-login can be. Note these are not the full classes just pertinent code extracts.

1. Remember me

When the user login and checks the “Remember me” checkbox, the :save_login parameter is set, the User instance remember_me method invoked and the :auth_token cookie set.

class AccountController < ApplicationController
def login
case request.method
when :post
if @session[:user] = User.authenticate(
params[:user_login], @params[:user_password])
flash[‘notice’] = “Login successful”
if @params[:save_login] == “1”
@session[:user].remember_me
cookies[:auth_token] = { :value => @session[:user].remember_token , :expires => @session[:user].remember_token_expires }
end
redirect_back_or_default :controller => “time”
else
flash.now[‘notice’] = “Login unsuccessful”
@login = @params[:user_login]
end
end
end
def logout
@session[:user].forget_me if @session[:user]
@session[:user] = nil
cookies.delete :auth_token
end
end

2. login_from_cookie

The next time the user visits the website the “login_from_cookie” filter is triggered. This method checks that the user is not logged in and that the :auth_token cookie is set. If that’s the case the user matching the :auth_token is searched and the token_expiration verified the the user is automatically logged in. Et voila!
I guess auto_login would be more appropriate as method name.

class ApplicationController < ActionController::Base
before_filter :login_from_cookie
def login_from_cookie
return unless cookies[:auth_token] && @session[:user].nil?
user = User.find_by_remember_token(cookies[:auth_token])
if user && !user.remember_token_expires.nil? && Time.now < user.remember_token_expires
@session[:user] = user
end
end
end

3. the User class

The User class has two methods to set and remove the token from the database. It’s pretty secure as from the token the user cannot be identified without having the salt, the email, and the token expiration, which is most unlikely to be recreated. It could be even more secure by just encrypting some random unique identifier. The only issue I encountered was that the user class always forces the password validation and encryption when saving. For now I just bypass validation and encryption when setting and clearing the remember_me token.

class User < ActiveRecord::Base
def remember_me
self.remember_token_expires = 2.weeks.from_now
self.remember_token = Digest::SHA1.hexdigest(“#{salt}—#{self.email}—#{self.remember_token_expires}”)
self.password = "" # This bypasses password encryption, thus leaving password intact
self.save_with_validation(false)
end
def forget_me
self.remember_token_expires = nil
self.remember_token = nil
self.password = "" # This bypasses password encryption, thus leaving password intact
self.save_with_validation(false)
end
end

Glenn Vanderburg – Ruby on Rails Podcast


This post is by Ruby on Rails Podcast from Ruby on Rails Podcast


Click here to view on the original site: Original Post




Glenn Vanderburg on metaprogramming. Formatted as MP3 this time…enhanced MPEG-4 versions will be available in a separate feed starting next episode.

Glenn Vanderburg – Ruby on Rails Podcast


This post is by Ruby on Rails Podcast from Ruby on Rails Podcast


Click here to view on the original site: Original Post




Glenn Vanderburg on metaprogramming. Formatted as MP3 this time…enhanced MPEG-4 versions will be available in a separate feed starting next episode.

Sean Chittenden – Ruby on Rails Podcast


This post is by Ruby on Rails Podcast from Ruby on Rails Podcast


Click here to view on the original site: Original Post




Sean Chittenden talks about his Rails re-design work with Penny-Arcade.com, server scalability, and the open source business model.

Sean Chittenden – Ruby on Rails Podcast


This post is by Ruby on Rails Podcast from Ruby on Rails Podcast


Click here to view on the original site: Original Post




Sean Chittenden talks about his Rails re-design work with Penny-Arcade.com, server scalability, and the open source business model.

inline RJS


This post is by Daniel Wanja from onrails.org


Click here to view on the original site: Original Post




In my previous article I was playing with RJS templates and finding easy way to generate them. Well Thomas just posted some new goodies see http://mir.aculo.us/articles/2006/01/21/new-inline-rjs-for-rails. For quick updates no need to have a separte .rjs file.

class UserController < ApplicationController
def refresh
render :update do |page|
page.replace_html(‘user_list’,
:partial => ‘user’, :collection => @users)
page.visual_effect :highlight, ‘user_list’
end
end
end