Tutorial on field_observer?


I have the standard Country - State - City select boxes in a form and
want the select options to cascade dynamically. There are a few hits
for similar setups in the forum but I need something more fundamental.
Is there a website / book which details how to build this from scratch?
AWDwR v2 uses a search example which hasn’t helped me much…


Hi Taylor,

I don’t know of a good tutorial on this but we just completed a thread
on this very thing in past couple of days with an example. Be sure to
read the whole thing though because we ended up having to wrap the
Select tag in a Div to make it work on IE. See




Hi Taylor,

Maybe you have already seen this, but there is a plugin that creates
“conditional” selects based on your models

Take note of the second comment on the above page, if you are on edge
rails, you will have to do as the comment issuers states (at least I
had to).

The plugin worked really well for me.


On Dec 29, 6:55 pm, Taylor S. removed_email_address@domain.invalid



Thanks! I found that thread late last night and worked into the wee
hours of the morning getting it working. It was pivotal to my success.
The only difference in my usage was I had to use page.replace_html
because I had two levels of dependency and render :partial can only
update one item. Thanks again for that tutorial! Here is how I did it
for the archives:


<%= render(:partial => ‘country_options’, :layout => false) %>

<%= render(:partial => ‘state_options’, :layout => false) %>

<%= render(:partial => ‘city_options’, :layout => false) %>


Country -- <%= options_from_collection_for_select(@countries, :id, :name) %> <%= observe_field "building[country]", :url => {:controller => "buildings", :action => "country_changed"}, :with => "building[country]", :update => "building[state]" %>


State / Region -- <%= options_from_collection_for_select(@states, :id, :name) %> <%= observe_field "building[state]", :url => {:controller => "buildings", :action => "state_changed"}, :with => "building[state]", :update => "building[city]" %>


City -- <%= options_from_collection_for_select(@cities, :id, :name) %>

def create
if session[:person_id]
unless params[:building]
@building = Building.new
@countries = Country.find(:all)
@states = []
@cities = []
@building = Building.new(params[:building])
flash[:notice] = ‘Building was successfully created.’
redirect_to :action => ‘list’
redirect_to :controller => ‘login’, :action => ‘login’

def country_changed
# avoid freaking out if user deselects country
if params[:building][:country] == “0”
@states = []
@states = Country.find(params[:building][:country]).states
@cities = []

# update state list and reset city list
render :update do |page|
  page.replace_html 'state_options', :partial => 'state_options'
  page.replace_html 'city_options', :partial => 'city_options'


def state_changed
# avoid freaking out if user deselects state
if params[:building][:state] == “0”
@cities = []
@cities = State.find(params[:building][:state]).cities

# update city list
render :update do |page|
  page.replace_html 'city_options', :partial => 'city_options'



On Fri, 2006-12-29 at 18:47 +0000, fredrikbach wrote:

The plugin worked really well for me.

thanks for the link…it worked well for me too.