`

基于model动态地ComboBox为生成options

阅读更多
在使用RoR创建form时,很多时候需要基于model之间的关系创建ComboBox。RoR提供了很多方便的helper方法帮助我们完成一个 form的创建。例如,如果想要为article创建一个form,并且要为article选择category时,可以使用如下方法:
<% form_for(:material, :url => url, :html => { :method => method }) do |f| %>
  <p><label>Name</label><br/>
  <%= f.text_field :name %></p>
  <p><label>Category</label><br/>
  <%= f.select :category_id, get_category_select_options %></p>
  <p><label>Content</label><br/>
  <%= f.text_area :content %></p>
  <p><%= submit_tag 'Create' %></p>
<% end %>

而其中的get_category_select_options可以采用如下实现方式(定义在articles_helper中):
def get_category_select_options  
  Category.find(:all, :order => 'name').collect { |item| [item.name, item.id] }.insert(0, ['Please select...', nil])  
end

以上代码通过Category类找到所有的category,然后使用其中的name和id属性(注意顺序)作为options的label和data,最后在加入一个默认的选项“Please select...”。一切都很简单,不是吗?

然而,如果model之间的关联稍微复杂一点儿,就可能会在很多地方使用类似的方法获得ComboBox的选项,那么为每个可能成为ComboBox选项的model都写这么一个方法实在是太麻烦了。如果是在Java世界中,我们可以很快想到使用反射来解决这个问题。也就是说在知道类名的情况下,用 Class.forName得到Class对象,然后在调用其上的find方法之类的。但是我们使用的是Ruby这个号称动态能力超强的语言,有什么更容易的做法吗?当然,代码如下:
def get_select_options_for(symbol)  
  Object.const_get(symbol.to_s.capitalize).find(:all, :order => 'name').collect { |item| [item.name, item.id] }.insert(0, ['Please select...', nil])  
end

关键就在这个const_get方法上,它是Module的一个静态方法,所以我们可以通过Object来调用它。我们把类名传递进去,它就可以返回这个类。但是注意这里的写法,我们可以在返回类上直接调用find,而不是像Java那样clazz.getMethod(...).invoke (...),是不是非常的方便呢?我们可以把这个方法定义在application_helper中,这样在所有的view中就都可以使用了,那么上面的 form代码就变成了如下这样:
<% form_for(:material, :url => url, :html => { :method => method }) do |f| %>
  <p><label>Name</label><br/>
  <%= f.text_field :name %></p>
  <p><label>Category</label><br/>
  <%= f.select :category_id, get_select_options_for(:category) %></p>
  <p><label>Content</label><br/>
  <%= f.text_area :content %></p>
  <p><%= submit_tag 'Create' %></p>
<% end %>
分享到:
评论

相关推荐

    RibbonX动态生成ComboBox,DropDown的Item

    动态生成意味着在程序运行时,可以根据需求或者数据源动态地添加、删除或更新ComboBox和DropDown的选项。这在处理大量数据或者需要实时更新界面的情况下非常有用。例如,ComboBox可以用于让用户选择数据库中的某个...

    Ext4.0 动态修改ComboBox选择项(本地模式)

    通过上述步骤,你可以在Ext4.0的本地模式下灵活地管理ComboBox的选择项。这在开发过程中非常实用,尤其当需要根据用户行为或者特定条件动态调整下拉选项时。理解并熟练掌握这些技术,能够提升你的Web应用程序的用户...

    DataGrid动态绑定ComboBox

    DataGrid动态绑定ComboBox &lt;DataGridComboBoxColumn.EditingElementStyle&gt;

    DropDownList控件和comboBox控件自动生成年月日

    DropDownList控件和ComboBox控件自动生成年月日 DropDownList控件和ComboBox控件是ASP...通过使用三个DropDownList控件和autopostback 属性,我们可以实现动态地生成每月的天数,并提供了一个方便易用的日期选择功能。

    Delphi7StringGrid内动态添加ComBoBox的值

    本篇文章将详细讲解如何在Delphi 7的StringGrid中动态地添加ComboBox控件,并为Grid赋值。 首先,我们需要理解StringGrid的基本结构。StringGrid是TStringGrid组件,它是VCL(Visual Component Library)的一部分,...

    演示ComboBox控件自动生成年月日

    本示例聚焦于“演示ComboBox控件自动生成年月日”,这通常是为了创建日期选择功能,使得用户能方便地输入日期信息。ComboBox控件在各种开发环境中都有应用,如Windows Forms、WPF、ASP.NET等,这里我们以通用的思路...

    ComBoBox动态实例asp+zip

    综上所述,"ComBoBox动态实例asp+zip"的实现包括以下几个关键点:ASP页面处理用户请求,动态生成数据;HTML模板提供用户界面;JavaScript处理客户端交互,异步加载数据并更新ComboBox;PHP脚本负责服务器端数据的...

    动态定义silverlight DataGrid Columns(ComboBox)源代码

    本篇文章将深入探讨如何在Silverlight中实现动态地为DataGrid的某一列添加ComboBox控件,并提供相关的源代码示例。 首先,我们要理解Silverlight中的DataGrid控件和ComboBox控件的基本用法。DataGrid通常通过绑定到...

    QML-自定义ComboBox

    property alias model: comboBox.model property alias currentIndex: comboBox.currentIndex // 更多属性... ComboBox { id: comboBox // 设置其他属性... } // 添加自定义组件和逻辑... } ``` 在这个...

    VB基于ComboBox控件的自动匹配查询内容实例源码

    资源名:VB基于ComboBox控件的自动匹配查询内容实例源码 资源类型:程序源代码 源码说明:VB基于ComboBox控件的自动匹配查询内容实例 autocomplete 自动完成 适合人群:新手及有一定经验的开发人员

    VB.programming.model.ComboBox.input.design.rar_VB ComboBox

    这个“VB.programming.model.ComboBox.input.design.rar_VB ComboBox”压缩包显然包含了关于如何在VB环境中设计和实现ComboBox输入功能的代码模型。 在VB(Visual Basic)中,ComboBox提供了丰富的API接口,可以...

    Ext2.0本地模式动态修改combobox选择项

    标题中的“Ext2.0本地模式动态修改combobox选择项”指的是使用Ext JS 2.0框架中的Combobox组件在本地数据模式下实现动态更新选择项的功能。Ext JS是一个流行的JavaScript库,主要用于构建富客户端Web应用程序。...

    unity3D 制作的ComboBox组件

    4. **数据绑定**:将选项数据与ComboBox组件连接,可以是硬编码的字符串数组,也可以是从数据库或其他数据源动态加载。 5. **效果图**:压缩包中提供的效果展示,可以帮助理解组件的外观和功能。 6. **代码部分说明*...

    easyui中combobox后台交互实例

    EasyUI是一个基于jQuery的轻量级前端框架,它提供了一系列易于使用的UI组件,包括Combobox,用于创建下拉列表框,同时支持后台数据加载,实现动态筛选和搜索功能。 **EasyUI Combobox组件** EasyUI的Combobox组件...

    多选框Combobox

    在技术实现上,Combobox插件通常基于JavaScript和jQuery库,这两种技术为实现动态交互提供了便利。JavaScript负责处理用户的输入和事件触发,而jQuery则简化了DOM操作和事件绑定,使得代码更加简洁高效。此外,对于...

    Q703119 问题的回答 c# combobox如何动态模糊查询?v2

    在实际应用中,我们经常需要实现ComboBox的动态模糊查询功能,以提高用户体验,允许用户在输入时实时过滤出匹配的选项。这个问题,即"Q703119 问题的回答 c# combobox如何动态模糊查询?",主要探讨的就是如何在C#中...

    vb.net DataGridView中添加ComboBox和按钮的控件

    它允许程序员动态地生成列,并可以与数据库或其他数据源绑定。在`DataGridView`中添加自定义控件,如`ComboBox`和按钮,可以提供更丰富的用户界面体验。 添加`ComboBox`到`DataGridView`: 1. 创建一个`...

    easyui的datagrid中editor和combobox的级联

    EasyUI是一个基于jQuery的UI框架,它提供了一系列轻量级、易于使用的组件,如Datagrid、Combobox等,帮助开发者快速构建用户界面。 首先,我们要理解EasyUI的Datagrid。Datagrid是EasyUI中的一个核心组件,它用于...

    ComboBox

    7. **数据绑定**:如果ComboBox用于展示数据库或动态数据,可能会介绍如何将数据源与ComboBox绑定,实现动态加载和更新选项。 在“combo_demo.htm”文档中,可能包含了一些ComboBox的示例代码或者交互式演示,帮助...

    ComboBox显示图片及下拉框根据字符串长度动态伸缩

    - 设置ComboBox的DroppedWidth属性为最大宽度,这样下拉框会根据最长的项自动伸缩。 - 当添加新项或更改项的文本时,需要重新计算并设置DroppedWidth。 4. **优化性能**: - 注意性能优化,避免在大量数据时频繁...

Global site tag (gtag.js) - Google Analytics