我的场景(运行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 %>
现在,当我选择一个类别时,没有任何反应。服务器日志根本不显示任何活动。
我的问题:
我是否需要一张“无操作”表格来封闭我的桌子?
<% form_tag('javascript:void(0)') do %>
<table> ... </table>
<% end %>
select_tag是否需要onChange?当前的HTML代码包含:
<select id="filter_by_category" name="filter_by_category" onChange="filter_by_category">.....
这是否意味着我必须为filter_by_category创建一个帮助器/控制器?如果是这样,它应该包含什么?我只想刷新表格。
我是否需要为observe_field指定更多选项,例如更新等?
在“_product.html.erb”中,用户选择后,“filter_by_category”未设置为所选的类别名称。
有没有更好的方法来实现这种动态过滤?
使用link_to_remote而不是observe_field怎么样?用户首先选择类别,然后单击要刷新的表的link_to_remote。通过这种方法,我至少可以让它刷新表格。但是,我仍然不知道如何捕获/指定要在部分过滤中使用的选定值。
对任何问题的任何回复都非常感谢。
HOCA
答案 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'
});