做一个修改分类的功能,添加的部分已经实现,修改的时候,如何让下拉菜单中默认选中当时的值
controller
def edit
@books=Book.find(:params[:id])
end
edit.rhtml
....
<%= select(:book,:cateid,Books.find(:all),:id,:name)%>
....
现在是找出了所有的分类,请教高手如何设置他的默认值呢?
[b]问题补充:[/b]
汪兄:
@post.person_id=>2
select("post", "person_id", Person.find(:all).collect {|p| [ p.name, p.id ] }, {:include_blank => 'None'})
这个我看到过,但具体到代码不知道如何实现。
我的表是这样的
id cateid name
父分类id 名称
其实最后形成的是一个二级的分类。
(:book,:cateid,Category.find(:all).....
下拉框中的是父分类
然后源代码中还会有一个文本框,文本框对应的是name。
[b]问题补充:[/b]
您提到的:controller
def edit
@book=Book.find(:params[:id])
end
edit.rhtml
....
<%= select(:book,:cateid,Book.find(:all),:id,:name)%>
....
这样做我曾经试验过,<%= select(:book,:id,Book.find(:all),:id,:name)%>这里必须是id才能接受到参数,而非cateid
现在的问题是,我如何从controller中传cateid过来。
建议:cateid改名为category_id
[code="erb"]
<% form_for @book do |f| %>
.
.
<%= f.select :category_id, Category.find(:all).map{|c|[c.name,c.id]} %>
.
.
<% end %>
[/code]
你这样写也可以,不必太拘泥:(这样渲染速度可能会快一点)
[code="erb"]
.
.
<% Category.find(:all).each do |cate| %>
可以在标签里面循环,循环option,只取第一个,然后就跳出
<%for(int i=0;i if(i %>
<%=属性值%>
<%}else{
break;
}
}%>
这个写法就很多了。。
[code="ruby"]
options_arr = Array.new
for item in items
opt_val = [item[:name], "#{item[:id]}"]
options_arr.push(opt_val)
end
select_tag(name, options_for_select(options_arr, "#{selected}"))
[/code]
还有一个,是从rails源文件里看的:
[code="ruby"]
@post.person_id=>2
select("post", "person_id", Person.find(:all).collect {|p| [ p.name, p.id ] }, {:include_blank => 'None'})
[/code]
这个就是说你需要创建一个post实例给@post
然后由于你在select中的第一个参数定义的是post,于是rails会去找是否有对应的值域。
那么把你的改一改:
controller
def edit
@book = Book.find(:params[:id])
end
edit.rhtml
....
<%= select(:book,:cateid,Category.find(:all).collect {|p| [ p.name, p.id ] })%>
....
我是按你的逻辑来修改的你的代码。你在select中用Book.find(:all),但你的select却命名是cateid,这个就很奇怪了。
你自己修改下看看吧。
第一种是你没有对应类的时候可以用。第二种是ruby rails推荐使用的方式了。
实际上你这样应该就可以了
controller
def edit
[color=red]@book[/color]=Book.find(:params[:id])
end
edit.rhtml
....
<%= select(:book,:cateid,[color=red]Book[/color].find(:all),:id,:name)%>
....
我不知道你上面的select写法是否可以。
我以rails文档中的来改你的代码
select(:book, :cateid, Book.find(:all).collect {|b| [ b.name, b.id ] })
这样应该是可以的了。
select("post", "person_id", Person.find(:all).collect {|p| [ p.name, p.id ] })
你用这个方式
因为options生成接受的是数组。
我提供了两种,你都可以试下。第一种肯定是可以的。只是代码比较多
遵守命名约定很重要,如果不守约定,很多东西都不能简写
当然有时多写几行也不影响可读性
补充: 第2段的第5行,book应该改为@book,不好意思 :wink: