Notes posted by Soleone
RSS feedVideo tutorial
If you want to get up to speed with Rails’ caching and haven’t seen it already, definitely check out this video series on Scaling Rails:
New and improved version
As this method is now deprecated, check the documentation for the new version (adds some more options), which gets included via a module:
New test syntax
You can use either one and even mix in the same test case if you want:
class Test < Test::Unit::TestCase # old way to define a test method (prefix with test_) def test_should_be_valid_without_content assert Comment.new.valid? end # new way to define a test test "should be valid without content" do assert Comment.new.valid? end end
Real life use
If you’re wondering what the base64 format is used for, here are some examples:
-
HTTP Basic authentication: encode your username and password as one string, and add it as a header of an HTTP request. When a page requiring basic authentication gets called from a browser it results in a generic Username/Password dialog from that browser. See also http://en.wikipedia.org/wiki/Basic_access_authentication
-
Encode the binary content of images to base64 and embed it in XML documents, for example in web services
-
For more information see http://en.wikipedia.org/wiki/Base64
Just note that the encoded (character) data is about 30% larger than un-encoded (binary) data.
Binary files
Another real important flag is b when dealing with binary files. For example to download an mp3 from the internet you need to pass the b flag or the data will be screwed up:
# Downloads a binary file from the internet require 'open-uri' url = "http://fubar/song.mp3" open(url, 'rb') do |mp3| File.open("local.mp3", 'wb') do |file| file.write(mp3.read) end end
Don’t say you haven’t been warned. :)
Other regular-expression modifiers
Likewise you can set Regexp::IGNORECASE directly on the regexp with the literal syntax:
/first/i # This will match "first", "First" and even "fiRSt"
Even more modifiers
-
o – Perform #{} interpolations only once, the first time the regexp literal is evaluated.
-
x – Ignores whitespace and allows comments in * regular expressions
-
u, e, s, n – Interpret the regexp as Unicode (UTF-8), EUC, SJIS, or ASCII. If none of these modifiers is specified, the regular expression is assumed to use the source encoding.
Literal to the rescue
Like string literals delimited with %Q, Ruby allows you to begin your regular expressions with %r followed by a delimiter of your choice.
This is useful when the pattern you are describing contains a lot of forward slash characters that you don’t want to escape:
%Q(http://) # This will match "http://"
Literal syntax
As you propably know you can create an Array either with the constructor or the literal syntax:
Array.new == [] # => true
But there is also another nice and concise literal syntax for creating Arrays of Strings:
["one", "two", "three"] == %w[one two three] # => true
You can use any kind of parenthesis you like after the %w, either (), [] or {}. I prefer the square brackets because it looks more like an array.
Use this!
You should raise your own ArgumentError in methods to notify users of your class, if you think certain kinds of arguments aren’t acceptable.
def transfer_money(amount) unless amount.is_a?(Number) raise ArgumentError.new("Only numbers are allowed") end # ... Do the actual work end
Useful scenario
This can be quite useful, for example when writing a command line script which takes a number of options.
Example
Let’s say you want to make a script that can make the basic CRUD operations. So want to be able to call it like this from the command line:
> my_script create > my_script delete
The following script allows you to use any abbreviated command as long as it is unambiguous.
# my_script.rb require 'abbrev' command = ARGV.first actions = %w[create read update delete] mappings = Abbrev::abbrev(actions) puts mappings[command]
That means you can call it like this:
> my_script cr > my_script d
And it will print:
create delete