Ruby Symbol Table implementation using Binary Search
It's a good implementation, I can make the following improvement suggestions:

size/n aliasing: either add a comment explaining its purpose (a legitimate one could be the need to comply with some external interface), or pick one name and use it throughout the class.
rank(key) &lt; @n checks: change rank to return nil when the key is not found. This is a common Ruby idiom. In Ruby 0 is truthy unlike many other languages.
@keys[i] == key: This check may be better off in a separate method, i.e. instead of a single rank method have one method that returns the rank when finding and one that returns the place for insertion.
Exception raises: the idiomatic Ruby way is to define needed exception classes (you could nest them in the BinarySearchST class) rather than raising strings.
Further on exception raises, it is a good practice to provide a descriptive message when raising each exception.
It's understandable if you want to move array elements yourself, but Ruby standard library does provide the Array#insert method which would do that for you.