Recent notes

RSS feed
December 31, 2009
2 thanks

Replacing with "\" and match — a simple solution

A somewhat different approach to the same problem:

v.gsub(/(?=\W)/, '\\') #=> Foo\ Bar\!

But from what you are trying to achieve I suspect you might be interested in Regexp.escape method :)

December 28, 2009
4 thanks

Attribute names are Strings, not Symbols

Another possible gotcha – the returned hash keys are of type String, not Symbol:

user.attributes["login"] # => "joe"
user.attributes[:login] # => nil
December 23, 2009 - (<= v2.3.2)
0 thanks

Compare dates

You can check a date resides between two dates.

Date.today.between?(Date.yesterday, Date.tomorrow)

will return true

Date.yesterday.between?(Date.today, Date.tomorrow)

will return false

December 21, 2009
0 thanks

expire_page outside controller and sweepers

If you want to expire cached pages from scripts or console just use class-method expire_page. But don’t forget about difference between instance and class method. In class-method you pass page url, not a hash of action/controller:

ActionController::Base.expire_page your_page_url
December 21, 2009 - (>= v2.0.0)
0 thanks

Expire cache from console or whatever...

I know only one possible method:


December 18, 2009
4 thanks

Version Ranges

To specify a version range, use array syntax like this:

config.gem 'paperclip', :version => ['>=', '< 3.0']

The example will, of course, match any version or newer up until (not including) 3.0 or later.

December 16, 2009
0 thanks


send_file always uses the absolute path /www/somewebsite/public/downloads/file

December 13, 2009
1 thank


create generates the object and saves. new only generates the object.


o = Object.new(:foo => 'bar')

is the same as

o = Object.create(:foo => 'bar')
December 13, 2009
0 thanks

What's difference between create and new?

What’s difference between create and new?

December 3, 2009
2 thanks

Replacing with "\" and match

If you’re trying to place a “" in front of your matches, you’ll quickly see that it is a pain in the ass to add the quoting in the replacement string.

Here’s an example:

v = "Foo Bar!"  # Target: Foo\ Bar\!
# Resulting strings will not be quoted to decrease
# the amount of backslashes. Compare \\! to "\\\\!"

v.gsub(/\W/, '\0') #=> Foo Bar!

# \\ escapes to a literal \, which next to the 0 becomes \0
v.gsub(/\W/, '\\0') #=> Foo Bar!

# \\\0, means "\ \0", or "escaped \0"
v.gsub(/\W/, '\\\0') #=> Foo\0Bar\0

# Same mechanism as before. \\ → \
v.gsub(/\W/, '\\\\0') #=> Foo\0Bar\0

# Finally! We have now an escaped \ before \0 and
# we get the results we want.
v.gsub(/\W/, '\\\\\0') #=> Foo\ Bar\!

# It's very tempting to just write it like this now, right?
v.gsub(/\W/) { |m| "\\#{m}" } #=> Foo\ Bar\!
# It might not be shorter, but anyone can understand it.

Surely, there must be an easier way to do this. I haven’t found it, though. Hopefully, this makes it easier for you to understand why it behaves the way it does. :-)

December 3, 2009 - (v1_8_6_287 - v1_8_7_72)
0 thanks

Testing Regular Expressions?

Writing regular expressions is never easy. You may use http://rubular.com to test and optimize your regular expressions.

December 3, 2009 - (>= v2.2.1)
1 thank

Capturing blocks after >2.2

After 2.2, you can omit the do …end block and simply use the &block variable directly:

concat(content_tag(:div, :class => "wrapped_content") do
end, block.binding)

becomes simply:

concat(content_tag(:div, capture(&block), :class => "wrapped_content"))
December 2, 2009
2 thanks

IE GOTCHA - multiple javascript_include_tags with cache => true

If you have multiple lines of javascript_include_tag ‘jsfile’, :cache => true, IE does not load them all (though it seems Firefox and Safari do). And the error won’t show up until you’re in production (since that’s only when caching kicks in.)

You should include them all on one line:

javascript_include_tag 'file1.js', 'file2.js', 'file3.js', :cache => 'myfiles'
November 30, 2009
2 thanks

Clearing out previous values from content_for

By default, content_for :thing appends whatever you put in your block to the previous value of :thing. In some cases, you’d like to clear out :thing rather than append to it.

I just posted a way to do this on my blog: http://stevechanin.blogspot.com/2009/11/clearing-out-content-in-contentfor.html

I add a new method set_content_for that works just like content_for, but clears out :thing first. It doesn’t touch how content_for works, so it shouldn’t cause any problems anywhere else in your app.

November 30, 2009
0 thanks

You can specify the format as well

You can also specify the format (in case you need to redirect a request coming in one format to another format):

redirect_to :action => 'show', :format => 'html'
November 26, 2009
0 thanks

How to check if a Yield has content?

How do I do this without actually calling the yield?

- if yield :footer
  = yield :footer
- else
  = render "layouts/footer_big"

(Note: HAML Syntax) Thanks.

November 26, 2009
0 thanks

How to use with HAML

Are you using HAML and try to do the block-thing (do…)? Please note that the whole block has to be in a single line. More: http://groups.google.com/group/haml/browse_thread/thread/52e62ef501c504a3

November 26, 2009
0 thanks

Streaming Does Not Work with Mongrel

If you are trying to stream output via render :text => Proc and Mongrel, be sure to note that this does NOT work. Mongrel returns a StringIO, which by nature buffers everything.

Unsure of how to actually stream output with Rails in a consistent fashion.

November 23, 2009
3 thanks

Make directory if not exists

If the directory already exists, mkdir raises exception. To prevent this:

Dir.mkdir(dir) unless File.exists?(dir)
November 22, 2009
0 thanks

assert_response(:success) checks if the status code is in the range 200-299

success? in ActionController::TestResponseBehavior is defined as:

def success?
November 18, 2009
0 thanks

Be careful with float ranges

Pay close attention to the fact that the object passed to :in must be enumerable.

If you want to validate a ranking, the following won’t work:

validates_inclusion_of :rating, :in => (0.0..10.0)

Instead, you’ll want to use validates_numericality_of like this:

validates_numericality_of :rating, :greater_than_or_equal_to => 0.0, :less_than_or_equal_to => 10.0
November 18, 2009 - (>= v1_8_6_287)
4 thanks



class Klass
  def set(string)
    var_name = "@#{string}"  # the '@' is required
    self.instance_variable_set(var_name, 'bar')
  def puts_foo
    puts @foo
k = Klass.new
k.puts_foo  # nil
k.puts_foo  # 'bar'
November 18, 2009
0 thanks

More Docs and Explanation

You probably want to look at the class level docs


(cut and paste, apidocks can’t render the above for some reason)

November 16, 2009
2 thanks
November 13, 2009
1 thank

style for select

<%= select(“post”, “person_id”, Person.all.collect {|p| [ p.name, p.id ] }, {}, :style => “width:100px” %>

November 13, 2009
1 thank

Careful with scopes

Just like find, find_in_batches introduces an implicit scope into the block. So for example

Person.find_in_batches(:conditions => {:birthday => Date.today}) do |birthday_childs|
  Person.all.each do |person|

does not work as expected, because the Person.all within the block will also find only persons with :conditions => {:birthday => Date.today}.

November 12, 2009
2 thanks

You can't use the :limit option either

Person.find_each(:limit => 10000)…

Will result in:

RuntimeError: You can’t specify a limit, it’s forced to be the batch_size

November 12, 2009
0 thanks

Rails documentation for nested attributes


(don’t follow this link, the url interpreter isn’t rendering it correctly :(, but the correct link is at the top of this page)

November 12, 2009
8 thanks

Use hash form of updates argument

The examples are unfortunate, because passing a string as the updates argument is an invitation to SQL injection attacks. Don’t do this!


Use the hash form of updates instead:

Billing.update_all(:author => author)

Then the SQL adapter will quote everything safely. Even if [you think] you’re sure there’s no quoting issue, it’s better to cultivate the habit of using the hash form just in case you missed something.

Same with conditions–use the hash or array form rather than a string if there are variables involved.

BTW, to do this and give options, of course you’ll need to put the braces back in:

Billing.update_all({:author => author},
                   ['title like ?', "#{prefix}%"])
November 11, 2009
2 thanks

Re: Taking care when writing regex

Oleg’s example from above contains an error and a pitfall:

validates_format_of :something => /^\w$/

The string “blahblahblah” doesn’t pass this validation. What Oleg ment is rather a continuous string of at least one alphanumeric character:

validates_format_of :something => /^\w+$/

However, that’s no good neither because it contains a well hidden trap in case you are validating content from a textarea.

Ruby (both 1.8 and 1.9) always matches ^ and $ against the beginning and ending of lines and not the entire string. Thus “First linenSecond line” will pass the above validation although it’s clearly not a continuous string.

You should use A (replacement for ^) and z (replacement for $) instead as their scope is the entire string:

validates_format_of :something => /\A\w+\z/

(A side note for those with a Perl background: Please note that the “s” modifier has a different meaning in Ruby and won’t do the trick here.)