Recent notes

RSS feed
June 26, 2008
8 thanks

Handy for adding theme support

I’m using this to add basic theme support to my app:

append_view_path(File.join(RAILS_ROOT, "app/themes/#{@current_theme}"))
append_view_path(File.join(RAILS_ROOT, 'app/themes/_base'))

Common templates go in app/themes/_base and then you can override these with specific theme versions in each theme directory.

June 25, 2008
13 thanks

How to test different responses in controller tests/specs

When you want to write a controller test or spec (rspec) to test out a different response type other than html, just set the HTTP_ACCEPTS header like so before the request:

@request.env['HTTP_ACCEPT'] = "application/rss"
post :create, :blog => {}
June 25, 2008
4 thanks

Custom MIME Type

After you register a custom Mime::Type like stated above, you can do:

respond_to do |format|
  # .jpg corresponds to the second argument passed to #register
  # Mime::Type.register "image/jpg", :jpg
  format.jpg { ...do something here... }
June 25, 2008
5 thanks

:expires_in not in Rails 2.1

AFAIK this is from a patch to Rails 2.1, which hasn’t been accepted yet.


Also, I think it needs to be supported by the cache_store you’re using.

June 25, 2008
4 thanks


The created association method also supports the ‘exists?’ method, similar to ActiveRecord::Base#exists?

has_and_belongs_to_many :categories
categories.exist?(1)   # Check whether there's a relation with a Category
                       # object whose id is 1.
categories.exist?(:id => 1)    # ditto
categories.exist?(['id', 1])   # ditto
categories.exist?(:name => 'Anime')
June 22, 2008
4 thanks

update_on and update_at only set on attribute change

If you call save, and no attributes are “dirty” (changed), then an update query will not happen against the database, and thus updated_at and updated_on will not be set.

You’ll need to modify at least one field to get updated_at and updated_on to set themselves.

June 22, 2008
9 thanks

Bang methods also need will_change!

As it says here at the bottom if you do in-place modifications using << you’ll need to call the will_change method!

This also goes for bang methods. So:

person = Person.first

will not save anything! Save will never be called. To get the name saved you need to do

person = Person.first

This will save the name.

June 22, 2008
This note might be spam Show
June 20, 2008
10 thanks

Set cache time-to-live

You can specify time-to-live for the cached item in seconds with :expires_in option.

class ListsController < ApplicationController
  caches_action :index, :expires_in => 1.hour
June 20, 2008
13 thanks

Nil V.S. Empty String HTML Options

There is a difference between an empty string and nil value for options hash.

Code Sample

content_tag( :div, 'Hello World!', :class=>'') # => "<div class="">Hello World!</div>"
content_tag( :div, 'Hello World!', :class=>nil) # => "<div>Hello World!</div>"
June 18, 2008
8 thanks

Using memcached as a session store

Because of Ruby’s CGI library limitations, store cannot have any configuration options. Basically this means that you cannot easily run memcached on a different port (or with any non-default settings for that matter).

You can bypass this limitation with this ugly hack (environment.rb):

cache_params = *([memcache_servers, memcache_options].flatten)
CACHE = MemCache.new(*cache_params)
ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS.merge!({ 'cache' => CACHE })

In your initializer block, just configure session_store normally:

config.session_store = :mem_cache_store

I think this should be fixed to work like cache_store= does.