Rails 2:Ajax&表显示基于所选选项的过滤

时间:2010-10-21 02:48:07

标签: ruby-on-rails

我的场景(运行Rails 2.3.5):

在部门的产品页面(index.js.rjs)上,有一个表格,显示产品的ID,名称和类别。此表的视图由名为_index.html.erb的部分文件指定。我将在表格上方的选项/选项下拉菜单中添加以显示所有产品类别。当用户从下拉菜单中选择一个类别时,Ajax会启动,以便仅使用类别等于所选类别的产品(即过滤操作)更新表(而不是整个页面)。

文件“_index.html.erb”有,

<table id='<%= dom_id(@department, :products) %>'>
<thead> 
    <tr>
    <%= select_tag("filter_by_category", 
        options_from_collection_for_select(Categories.find(:all, :order => 'name'), :name, :name) %>
    <%= observe_field("filter_by_category", 
                      { :url => department_products_path(:department_id => @department.id),
                        :method => :get,
                        :frequency => 0.5,
                        :with => "'filter_by_category=' + value" }) %>
    </tr>
    <tr> <td>id</td> <td>name</td> <td>category</td> </tr> 
</thead>

<% @products.each do |product| %>
    <%= render :partial => 'departments/product', :locals => {:product => product} %>
<% end %>
</table>

文件“_product.html.erb”有,

<!-- for now, using some simplistic conditionals to do the filtering -->
<!-- filter_by_category is not set to the selected category name after a user selection -->
<% if :filter_by_category == product.category %>
  <tr id='<%= dom_id(product) %>' >
    <td><%= product.id %></td>
    <td><%= product.name %></td>
    <td><%= product.category %></td>
  </tr>
<% end %>

现在,当我选择一个类别时,没有任何反应。服务器日志根本不显示任何活动。

我的问题:

  1. 我是否需要一张“无操作”表格来封闭我的桌子​​?

    <% form_tag('javascript:void(0)') do %> <table> ... </table> <% end %>

  2. select_tag是否需要onChange?当前的HTML代码包含:

    <select id="filter_by_category" name="filter_by_category" onChange="filter_by_category">.....

    这是否意味着我必须为filter_by_category创建一个帮助器/控制器?如果是这样,它应该包含什么?我只想刷新表格。

  3. 我是否需要为observe_field指定更多选项,例如更新等?

  4. 在“_product.html.erb”中,用户选择后,“filter_by_category”未设置为所选的类别名称。

  5. 有没有更好的方法来实现这种动态过滤?

  6. 使用link_to_remote而不是observe_field怎么样?用户首先选择类别,然后单击要刷新的表的link_to_remote。通过这种方法,我至少可以让它刷新表格。但是,我仍然不知道如何捕获/指定要在部分过滤中使用的选定值。

  7. 对任何问题的任何回复都非常感谢。

    HOCA

1 个答案:

答案 0 :(得分:0)

请浏览http://guides.rubyonrails.org/working_with_javascript_in_rails.html

我有一个类似的案例,我使用以下方法解决了它。当Ajax开始时,我用“&#39; js”调用我的控制器动作。格式。它将从.js.erb返回代码。您可以使用javascript更新该文件中的表格。 在我的情况下,我必须附加我的搜索结果,我的.js.erb文件已

$("<%= escape_javascript(render :partial => '<action>/user_results', :locals => {:users => @users}) %>").appendTo(".search-results");

在Ajax调用中,此js响应被执行

$.ajax({
  url: '<url>.js',
  type: 'GET'
});