Tutorial on field_observer?


#1

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…


#2

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/#

-Paul


#3

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)

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


#4

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


#5

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