My solution, without extra credits.

#! /usr/bin/ruby

class MagicSquare
   def initialize( ord )
     @ord = ord

     checkOrd
     initSquare
     makeSquare
     printNiceSquare
   end

   def checkOrd
     if @ord%2 != 1 || @ord < 0
       puts "Not implemented or not possible..."
       exit
     end
   end

   def setCoord( row, col, number )
     loop do
       if @square[row][col].nil?
         @square[row][col] = number
         @oldCoord = [row, col]
         return
       else
         row = @oldCoord[0] + 1
         col = @oldCoord[1]
         row -= @ord if row >= @ord
       end
     end
   end

   def initSquare
     @square = Array.new(@ord)
     @square.each_index do |row|
       @square[row] = Array.new(@ord)
     end
   end

   def makeSquare
     (@ord**2).times do |i|
       setNewCoord( i + 1 )
     end
   end

   def setNewCoord( i )
     if @oldCoord.nil?
       setCoord(0, (@ord + 1)/2-1, i)
     else
       row = @oldCoord[0] + 2
       col = @oldCoord[1] + 1

       row -= @ord if row >= @ord
       col -= @ord if col >= @ord

       setCoord(row, col, i)
     end
   end

   def printNiceSquare
     width = (@ord**2).to_s.length

     @square.each do |row|
       row.each do |nr|
         nr = nr.nil? ? "." : nr
         spaces = width - nr.to_s.length
         print " "*spaces + "#{nr}" + "  "
       end
       puts
     end
   end
end

ord = ARGV[0].to_i
MagicSquare.new( ord )