使用Ajax动态地将项添加到Ruby On Rails中的选择列表中

时间:2010-08-12 20:50:58

标签: ruby-on-rails ajax select

我已经为此考虑了一大堆解决方案,也许我只是密集,但我无法得到任何工作。这是我试图在产品/新视图中绑定的两个选项,允许用户选择产品类别,然后约束子类别列表:

 <p>
   <%= f.label :category_id %>: 
   <%=  f.select("category", Category.find(:all).collect {|c|[c.name, c.id]})%>
 </p>
 <p>
   <%= f.label :subcategory_id %>:
   <%=  f.select("subcategory", Subcategory.find(:all).collect {|s|[s.name, s.id]})%>
 </p>

我的子类别控制器中有一个函数来从数据库中获取信息:

  def get_subcategories
    @subcategories = Subcategory.find_by_category_id(:all)
  end

但我无法弄清楚如何将它连接在一起,而且看起来它在RoR中应该很容易。

1 个答案:

答案 0 :(得分:0)

嗯,这并非完全无足轻重,但只需付出一点努力即可实现。基本方法是:

  • 在最初呈现视图时填充类别选择列表
  • 添加一个javascript处理程序,以便在更改时触发
  • 在此处理程序中对服务器执行AJAX调用,并在控制器操作中调用get_subcategories方法
  • 让控制器操作响应填充子类别选择列表的值
  • 让AJAX响应处理程序更新子类别选择列表的HTML
  • 如果您希望在最初呈现表单时使用默认值填充类别选择列表,您将希望在此时自动进行AJAX调用,甚至在用户选择任何内容之前。

例如,在JQuery中,您可以将它与以下方法结合使用

  • .change()在选择列表
  • 上设置处理程序
  • .triggerEvent('change')会导致事件在加载后触发(如果需要)
  • $.getJSON()可用于获取和解析AJAX响应
  • .remove().append()可用于清除和更新子类别选择结果