一个关于分类和所属分类怎样设置的问题

[size=large]分类表:
create_table :categories do |t|
t.string :name
t.integer :parent_id [color=red]#用于存储该分类的子分类[/color]
t.timestamps
end
add_index :categories, :name
end

商店表:
create_table :shops do |t|
t.integer :user_id,
t.integer :category_id,
t.text :description
t.timestamps
end
end

我的问题是:
在给商店选择一个分类时,首先是选择一个行业的分类 如:计算机,再就是选择 计算机下的--硬件 或 软件 分类了。
我现在只能选择第一级别的分类(计算机),而 他对应的子分类怎么都想不出来?
第一级别的分类我是这样实现的:

<% form_for @shop do |f| %>


  • 商店名称:

    <%= f.text_field :name%>

             [color=brown] <%= f.collection_select :category_id, Category.find(:all), :id, :name, {:prompt => '行业类型:'} %>[/color]
    

    #应该在这里再加一个选择列表,可是怎么弄???




<% end %>

代码仅是为了说明情况,不要受干扰。

各位大哥,支援一下。
[/size]

我的分数被扣没了,等有了一定嘉奖。

[b]问题补充:[/b]
恢复: 夜鸣猪 (初级程序员) 2009-02-23
你给我复制的代码我也见过。
我想要一个二联机的下拉列表框
就像你给出的列子一样 第一个列表框是省份,选择后,在 第二个下拉框中选择对应的城市。
这个 remote_function 怎样才能返回值(即@cities),还有update更新的那个部分的数据?
能给讲解一下?
[b]问题补充:[/b]
你说的这些我明白了,但现在唯一做不到的是 :with => "'province_id='+value" 的province_id 无法得到。
是不是有别的写法?
[b]问题补充:[/b]
我在views下:
<%= f.select :province_id, @provinces , {:include_blank => true},
{:onchange => remote_functi[size=large][/size]on(:update => 'city_select', :method => 'get',
:with => "'partial=select",
:url => {:controller => :cities, :action => :index, [color=red]:province_id => :value[/color]})}
%>


<%= f.select (:city_id, []) %>

在cities controller下:
def index
if params[:province_id]
@cities = City.find(:all, :conditions => ["province_id = ?", params[:province_id]])
else
@cities = City.find(:all)
end
respond_to do |format|
format.html { render :partial => params[:partial]}
format.xml { render :xml => @cities }
end
end
#_select.html.erb中:
<%= select(:user, :city_id, @cities.collect {|c| [c.name, c.id]}) %>

现在的问题是 :value的值去不出来!我这样实验的:用固定数值1 能成功。就说:value的值我不会取。你是怎么获取的???
..
..
:url => {:controller => :cities, :action => :index, [color=red]:province_id => 1[/color]})}

我不会用f.select我自己调试半天,我也没有找到f.select对应的value,我就会用下面的方法,也的确可以传过去值。我不行了,看看别人谁懂吧^_^

搞明白了,也回我一个吧,谢谢^_^
[code="irb"]<%= select(:product, :id, @products.map {|u| [u.title, u.id]},options = {},
html_options = {"onchange" => remote_function(
:with => "'product_id='+value",
:update => 'city_select',
:url => { :action => 'select_with_ajax' })})
%>[/code]

这位兄弟,我是希望帮你,可是我不太明白你想干什么?
你是想做一个级联表(或者母子表)吗?

然后,母表的下拉菜单是 --行业分类
子表的下拉菜单是 --商店分类

然后,点击母表的下拉菜单并选中,子表就是根据外键连接,AJAX更新子表的内容,并且可以选择

你是想要这样的效果吗?

如果,我理解的没太大差异的话,下面的代码可能是你要的
controller里边:
[code="ruby"]
def test
@provinces = Province.find(:all)
end

def select_with_ajax
@cities = City.find(params[:province_id])
render :partial => "select_city"
end
[/code]

test.rhtml的代码:

[code="html"]
<%= javascript_include_tag :defaults %>
<%= select(:province, :id, @provinces.map {|u| [u.name, u.id]},options = {},
html_options = {"onchange" => remote_function(
:with => "'province_id='+value", :update => 'city_select',
:url => { :action => :select_with_ajax })})
%>
[/code]

_select_city.rhtml的代码:

[code="ruby"]
<%= select(:city, :id, @cities.map{|u| [u.name,u.id]}) %>
[/code]

:D
是你想要的就好。

首先,你应该,调通代码。

  1.    :update=>'city_select',是说更新一个<div id='city_select'></div>的区域。

  2.    @cities能够得到,是因为在province的下拉菜单点击后,通过

[code="irb"] :url => { :action => :select_with_ajax })}[/code]来调用[code="irb"]def select_with_ajax

@cities = City.find(params[:province_id])

render :partial => "select_city"

end [/code]这个方法,并且通过[code="irb"]:with => "'province_id='+value" [/code]传给select_with_ajax一个province_id的参数。这样_select_city.rhtml页面就有一个@cites的参数了,也就是说可以根据你点击的province的下拉列表,得到province_id并且传给cite的下拉列表,并调用AJAX动态更新cite的下拉菜单,显示出,对应province的所属cite

[code="irb"]:url => { :action => 'select_with_ajax',:province_id => value [/code]

你是想说上面的意思吗?