# Tutorial on field\_observer?

**URL:** <https://www.ruby-forum.com/t/tutorial-on-field-observer/80605>\
**Category:** Rails\
**Created:** [December 29, 2006, 5:10am UTC](https://www.ruby-forum.com/t/tutorial-on-field-observer/80605 "2006-12-29T05:10:10Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![taylorstrait](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b5a626/32.png) [@taylorstrait](https://www.ruby-forum.com/u/taylorstrait)\
**Post date:** [December 29, 2006, 5:10am UTC](https://www.ruby-forum.com/t/tutorial-on-field-observer/80605/1 "2006-12-29T05:10:10Z")

</div>

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…

---

<div class="post-metadata">

**Author:** ![taylorstrait](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b5a626/32.png) [@taylorstrait](https://www.ruby-forum.com/u/taylorstrait)\
**Post date:** [December 29, 2006, 6:18pm UTC](https://www.ruby-forum.com/t/tutorial-on-field-observer/80605/2 "2006-12-29T18:18:57Z")

</div>

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

[http://groups.google.com/group/rubyonrails-talk/browse\_frm/thread/b7570e72171a37e9/#](http://groups.google.com/group/rubyonrails-talk/browse_frm/thread/b7570e72171a37e9/#)

-Paul

---

<div class="post-metadata">

**Author:** ![taylorstrait](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b5a626/32.png) [@taylorstrait](https://www.ruby-forum.com/u/taylorstrait)\
**Post date:** [December 29, 2006, 7:49pm UTC](https://www.ruby-forum.com/t/tutorial-on-field-observer/80605/3 "2006-12-29T19:49:24Z")

</div>

Hi Taylor,

Maybe you have already seen this, but there is a plugin that creates  
“conditional” selects based on your models  
([http://www.agilewebdevelopment.com/plugins/related\_select\_forms](http://www.agilewebdevelopment.com/plugins/related_select_forms))

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.

-Fredrik

On Dec 29, 6:55 pm, Taylor S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![taylorstrait](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b5a626/32.png) [@taylorstrait](https://www.ruby-forum.com/u/taylorstrait)\
**Post date:** [December 29, 2006, 6:55pm UTC](https://www.ruby-forum.com/t/tutorial-on-field-observer/80605/4 "2006-12-29T18:55:58Z")

</div>

Paul,

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:

---------VIEWS-----------  
**\_form:** \*\*\*

\<%= render(:partial =\> ‘country\_options’, :layout =\> false) %\>

\<%= render(:partial =\> ‘state\_options’, :layout =\> false) %\>

\<%= render(:partial =\> ‘city\_options’, :layout =\> false) %\>

**\_country\_options:** \*

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\_options:** _\*\*

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:**

City -- \<%= options\_from\_collection\_for\_select(@cities, :id, :name) %\>

-----CONTROLLER--------  
def create  
if session[:person\_id]  
unless params[:building]  
@building = Building.new  
@countries = Country.find(:all)  
@states = []  
@cities = []  
else  
@building = Building.new(params[:building])  
@building.save  
flash[:notice] = ‘Building was successfully created.’  
redirect\_to :action =\> ‘list’  
end  
else  
redirect\_to :controller =\> ‘login’, :action =\> ‘login’  
end  
end

def country\_changed  
# avoid freaking out if user deselects country  
if params[:building][:country] == “0”  
@states = []  
else  
@states = Country.find(params[:building][:country]).states  
end  
@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'
end

```

end

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

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

```

end

---

<div class="post-metadata">

**Author:** ![taylorstrait](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b5a626/32.png) [@taylorstrait](https://www.ruby-forum.com/u/taylorstrait)\
**Post date:** [December 30, 2006, 11:27pm UTC](https://www.ruby-forum.com/t/tutorial-on-field-observer/80605/5 "2006-12-30T23:27:39Z")

</div>

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.

Craig
