problem with id's

I am not sure I follow, but:

There is no :id being passed to the controller from the form.

The create method could be:

def create
  @country=Country.find_or_create_by name(params[:country])

  @state=State.find_or_create_by_name(params[:state])
  @state.country_id = @country.id
  @state.save

  @city=City.create(params[:city])
  @city.country_id = @country.id
  @city.state_id = @state.id
  @city.save

  @category=Category.find_or_create_by_name(params[:category])
  @category.country_id = @country.id
  @category.state_id = @state.id
  @categort.city_id = @city.id
  @category.save

  redirect_to :action =>'list'

end

Anyone have another way?

Opps.

Move the SQL logic out of your view - it's bad practice. Much more
readable if its in the controller, or even better pushed down to the
model.

Try this in the list view:

<%= form_tag :action => "update" do %>

  <h4>Select Country<br>
  <% @countries.each do |country| %>
    <%= select('name', country) %><br>
  <% end %>

  <h4>Select State<br>
  <% @states.each do |state| %>
    <%= select('name', state) %>
  <% end %>

  <h4>Select City<br>
  <% @cities.each do |city| %>
    <%= select('name', city) %><br>
  <% end %>

  <h4>Select Category<br>
  <% @categories.each do |category| %>
    <%= select('name', category) %><br>
  <% end %>

  <%= submit_tag %>

<%= end %>

and in the controller:
def list
  @countries = Country.find(:all)
  @states = State.find(:all)
  @cities = City.find(:all)
  @categories = Category.find(:all)
end

* The list view code may not work and it's ugly, but you get the idea.
Can anyone tell us if you can do something like:

<%= select('name', @categories) %>

??

OK, so you have the same basic problem iterated a few times.

I began to type a few answers to this problem, but kept coming into
trouble.

Example 1 - Creating a state:

def state
  @state=State.create(params[:state])
  @state.country_id = @country.id
  @state.save
  redirect_to :action =>'list'
end

Should be:

def state
  @state=State.create(params[:state])
  @state.country_id = Country.find_by_name(params[:country]).id
  @state.save
  redirect_to :action =>'list'
end

BUT when the final form is submitted it will create YET ANOTHER state
in the table....

OK, how about we create some dynamic drop down boxes that change
content based on previous selections?
Doable, but a little messy and probably a bit too much effort at this
point.

What about this? In your main form have a drop down list *and* a text
field.
The user can either select the country/state/city/category from the
list, and if they do not find it can type one in.
Then check for the values submitted and act appropriately:
no drop down selected, no text = throw an error
drop down, no text = use drop down value
drop down + text = text overrides dropdown(?? or vice versa?) <= User
must be informed prior
no drop down + text = Use text.

Along the right track?