Hi,
I’m a former PHP developer moving to Ruby and Rails. I’ve written a
little
rake task to provide an interactive console for setting and removing
session
values to help debugging the site. It all works, only thing is that it
feels
to me like I´ve written Ruby in PHP style but I don’t know where to
start
fixing it. I would appreciate any suggestions.
I´ve put it into pastie at: Parked at Loopia but I’ve also
copied it below.
In my generic debugging rake tasks file:
desc ‘View and edit session data’
task :sessions => :environment do
# Message used when finding sessions
msg_session = <<-EOF
** SESSION CHECKER
Enter a session id to find the session in the format of
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
/(q)uit
EOF
# When viewing a session
msg_view = <<-EOF
Commands:
/(v)iew to view all values in the session
= to set a value
(d) to delete that field from the session
(f)ind to search for a new session
(q)uit to exit
EOF
# Begin session finding loop
loop do
breaker = nil
# Output the message
puts msg_session
print '> '
# What are we doing?
str = STDIN.gets.chomp
break if str.empty? || str =~ /^q$/i
# Does this session exist?
if CGI::Session::ActiveRecordStore::Session.exists? :session_id =>
str
session_id = str
watch = []
loop do
session = CGI::Session::ActiveRecordStore::
Session.find_by_session_id session_id
# Display the session data sorted, with the modified fields
shown
in green
longest_key = 0
session.data.each { |k,v| longest_key = k.to_s.length if
k.to_s.length > longest_key }
puts "\nAll variables in session: %s" % session.session_id
session.data.each do |k,v|
str = " :%-#{longest_key}s => %s" % [k,
CfSimple.describe_var
(v)]
puts watch.member?(k) ? green(str) : str
end
# What are we doing with this item?
puts msg_view
print '> '
str = STDIN.gets.chomp
next if str.empty? || str =~ /^v$/i
breaker = :quit and break if str =~ /^q$/i
breaker = :find and break if str =~ /^f$/i
if str =~ /^d ([a-z0-9 _]+)/i
puts red('Deleted %s' % $1)
session.data.delete $1.intern
session.save
next
end
# We're updating a value
if str =~ /([^=]+)=(.*)/
# Is the assignment valid yaml?
valid = true
YAML::parse(':%s: %s' % [$1, $2]) rescue valid = false
# Not good YAML
puts(red('Invalid assignment. Must be valid YAML.')) and
next
unless valid
# Now enter this as our new data
session.data[$1.intern] = YAML::parse($2).transform
session.save
# Add it to the watches
watch << $1.intern
next
else
puts red('Invalid assignment. Must match: /([^=]+)=(.*)/')
end
end
else
puts 'Error finding session %s' % str
end
break if breaker == :quit
end
end
CfSimple is a library of basic debugging functions. I’ve just include
the
one in use above.
class CfSimple
def self.describe_var(var)
return (var.nil? ? ‘nil’ : var) if [NilClass, TrueClass,
FalseClass].member? var.class
vals = [var.class.to_s + (!var.nil? && var.respond_to?(:length) ?
‘(%s)’ % var.length : ‘’) + ‘:’]
if var.is_a? Array
vals << '[%s]' % var.collect{ |a| describe_var a }.join(', ')
elsif var.is_a? Hash
vals << '{%s}' % var.collect{ |a| describe_var a }.join(', ')
elsif var.is_a? Numeric
vals << '%s' % var
else
vals << '"%s"' % var
end
vals.join ' '
end
end