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: http://pastie.caboo.se/98992 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
  <blank line>/(q)uit
EOF
    # When viewing a session
    msg_view = <<-EOF
Commands:
  <blank line>/(v)iew     to view all values in the session
  <field>=<value>         to set a value
  (d) <field>             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
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---