select 级联问题

  1. new.rhtml

New pr_cate

<%= javascript_include_tag 'prototype' %>
<% form_for(@pr_cate) do |f| %>
<%= f.error_messages %>

<%=f.select(:id, @pr_cates.map {|u| [u.name,u.id]},
{ :onchange => remote_function(
:with => "'id='+value",
:method => "get",
:update => 'next_select',
:url => { :action => :new } ) }

)%>

"test") %>

...

  1. controller

def new

if params[:id]
@pr_cates = PrCate.find(:all, :conditions => ["parent_id = ?", params[:id]])
else
@pr_cates = PrCate.find(:all, :conditions => ["parent_id = ?", "0"])
end

@pr_cate = PrCate.new

respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @pr_cate }
end
end

  1. _test.rhtml

<%= select("pr_cate","id", @pr_cates.map {|u| [u.name,u.id]}) %>

new前台界面中的情况是
第一个下拉项和第二个下拉项中的内容都来自
@pr_cates = PrCate.find(:all, :conditions => ["parent_id = ?", "0"])

第一个下拉项的onchange对第二个不起作用。

将你的代码

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

修改为
[code="ruby"]
<%=f.select(:id, @pr_cates.map {|u| [u.name,u.id]},
[b] [color=red]{},[/color][/b]
{:onchange => remote_function(....) }
)%>
[/code]

注意:
[quote]select(object, method, choices, options = {}, html_options = {})[/quote]
这里有两个hash,第一个是select的属性,第二个才是html的属性。

建议:
to:楼主
提问题的时候,将代码格式化下。

to:shunjian
你的代码噪音太大了,不如不回答....




<%
ServletContext servlet = config.getServletContext();
ApplicationContext ctx =
WebApplicationContextUtils.getRequiredWebApplicationContext(servlet);
CategoryManager cateMgr = (CategoryManager) ctx.getBean("categoryManager");
List catelist = cateMgr.getCategorysByCateId("0");
Category category;
Iterator it = catelist.iterator();
while (it.hasNext()) {
category = (Category) it.next();
if ((String) request.getAttribute("category1") != null && !request.getAttribute("category1").equals("null") && ((String) request.getAttribute("category1")).equals(String.valueOf(category.getId()))) {
out.println("" + category.getName() + "");
} else {
out.println("" + category.getName() + "");
}
}
%>
</select>





<%
String cate1id = (String) request.getAttribute("category1");
if (cate1id != null && !cate1id.equals("null") && request.getParameter("category2") != null && !request.getParameter("category2").equals("null")) {
List catelist1 = cateMgr.getCategorysByCateId(cate1id);
Iterator itt = catelist1.iterator();
while (itt.hasNext()) {
category = (Category) itt.next();
String category2id = request.getParameter("category2");
if (category2id != null && !category2id.equals("null") && category2id.equals(String.valueOf(category.getId()))) {
out.println("" + category.getName() + "");
} else {
out.println("" + category.getName() + "");
}
}
}
    %>
</select>


要在onchange中的 js方法中触发第2个级联第一个级联中的方法showSubCategory,在js中如下代码:
function sendRequestCategory(url) {
createXMLHttpRequest();
XMLHttpReq.open("GET", url, true);
XMLHttpReq.onreadystatechange = processResponseCategory;//ָ����Ӧ����
XMLHttpReq.send(null); // ��������
}
// ���?����Ϣ����
function processResponseCategory() {
if (XMLHttpReq.readyState == 4) { // �ж϶���״̬
if (XMLHttpReq.status == 200) { // ��Ϣ�Ѿ��ɹ����أ���ʼ������Ϣ
updateCategory();
} else { //ҳ�治��
alert("Operation failed!");
}
}
}
//���²˵�����
function updateCategory() {
var category = XMLHttpReq.responseXML.getElementsByTagName("category");
/**��������innerHTML���ؼ����ݵ�һ���÷�**/
//var subMenu = "";
//for(var i = 0; i < res.length; i++) {
// subMenu = subMenu + " " + res[i].firstChild.data + "";
//}
//currentSort.innerHTML = subMenu;
var listcate = document.all.category2;
listcate.options.length = 0;
listcate.add(new Option("choose", ""));
for (var i = 0; i < category.length; i++) {
var idcate = category[i].selectSingleNode("id").text;
var namecate = category[i].selectSingleNode("name").text;
listcate.add(new Option(namecate, idcate));
}
}
// ������j�˵�����
function showSubCategory(obj) {
//currentSort =document.getElementById(obj);
//currentSort.parentNode.style.display = "";
sendRequestCategory("service/category.jsp?id=" + obj);
/**������һ��������ǣ�ÿ��ѡ���ص���һ��ѡ��**/
//document.all.mli.options[0].selected=true;
}

sorry,javaeye的格式化代码有bug.上面的修改过后的代码显示不正确,如下:

[code="ruby"]<%=f.select(:id, @pr_cates.map {|u| [u.name,u.id]},

{},
{:onchange => remote_function(....) }

)%> [/code]