viva_yang
viva_yang
2009-01-20 09:02
浏览 354
已采纳

如何让下拉菜单中默认选中一个值

做一个修改分类的功能,添加的部分已经实现,修改的时候,如何让下拉菜单中默认选中当时的值

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过来。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

7条回答 默认 最新

  • xenocide
    xenocide 2009-01-23 23:33
    已采纳

    建议: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| %>

    点赞 评论
  • leonelwong
    马勒格彼得 2009-01-20 09:11

    可以在标签里面循环,循环option,只取第一个,然后就跳出

    <%for(int i=0;i if(i %>
    <%=属性值%>
    <%}else{
    break;
    }
    }%>

    点赞 评论
  • weixin_42513366
    Candyut 2009-01-20 09:26

    这个写法就很多了。。

    [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推荐使用的方式了。

    点赞 评论
  • weixin_42513366
    Candyut 2009-01-20 11:42

    实际上你这样应该就可以了

    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 ] })

    这样应该是可以的了。

    点赞 评论
  • weixin_42513366
    Candyut 2009-01-23 12:22

    select("post", "person_id", Person.find(:all).collect {|p| [ p.name, p.id ] })
    你用这个方式
    因为options生成接受的是数组。

    我提供了两种,你都可以试下。第一种肯定是可以的。只是代码比较多

    点赞 评论
  • xenocide
    xenocide 2009-01-23 23:36

    遵守命名约定很重要,如果不守约定,很多东西都不能简写

    当然有时多写几行也不影响可读性

    点赞 评论
  • xenocide
    xenocide 2009-01-23 23:54

    补充: 第2段的第5行,book应该改为@book,不好意思 :wink:

    点赞 评论

相关推荐