我有一个页面,上面有两种形式。每个表单都是过滤页面结果的不同方式。第一种形式是collection_select
. 第二种形式是text_field_tag
. 每个都提交到同一个控制器并使用index.js.erb
. Firebug 显示 Ajax 调用对它们都有效并返回正确的结果,但是,只有从text_field_tag
表单返回的结果才能真正更新页面。它使用相同的代码index.js.erb
来返回两个调用的结果,所以我不确定为什么一个有效而另一个无效。
index.html.erb:
<h1>Listing info</h1>
<%= render "partials/filter" %> OR
<%= render "search" %>
<div id="filter_table">
<%= render 'list' %>
</div>
_list.html.erb:
<table class="tablesorter">
<thead><tr><td>Name</td><td>ID</td><td>Description</td></tr></thead>
<tbody>
<% @info.each do |inf| %>
<tr><td><%= inf.name %></td><td><%= inf.id %></td><td><%= inf.desc %></td></tr>
<% end %>
</tbody>
</table>
index.js.erb:
$("#filter_table").replaceWith("<div id=\"filter_table\"><%= escape_javascript(render 'list') %></div>");
$(".tablesorter").tablesorter({widgets: ['zebra']});
_filter.html.erb:
<%= form_tag("#", :method => "get", :remote => true) do %>
<% cur_id = params[:id].to_i %>
<%= submit_tag("Filter") %>
<% end %>
_search.html.erb:
<%= form_tag("#", :method => "get", :remote => true) do %>
Search for an ID: <%= text_field_tag("id") %>
<%= submit_tag("Search") %>
<% end %>
控制器.rb:
def index
@info = Blahblah
respond_to do |format|
format.html
format.js
end
end
下面是从 AJAX 调用返回的一些示例:
作品:
http://hostname/blah?utf8=%E2%9C%93&id=Stuff&commit=Search
$("#filter_table").replaceWith("<div id=\"filter_table\"><table class=\"tablesorter\">\n <thead>\n <tr>\n <th class=\"{sorter: \'digit\'}\">One<\/th>\n <th>ID<\/th>\n <th>Person<\/th>\n <th>Person<\/th>\n <th>Two<\/th>\n <th>VID<\/th>\n <th>type<\/th>\n <th>Status<\/th>\n <th>Three<\/th>\n <th>Four<\/th>\n <th>Five<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <tr>\n <td><a href=\"/blah/801\" id=\"801\">801<\/a><\/td>\n <td>Meep<\/td>\n <td>1814<\/td>\n <td>Meep2<\/td>\n <td>Test<\/td>\n <td>Stuff<\/td>\n <td>unknown<\/td>\n <td>submitted<\/td>\n <td>47<\/td>\n <td>16.6<\/td>\n <td>7.9<\/td>\n <\/tr>\n<\/tbody>\n<\/table>\n\n\n\n</div>");
$(".tablesorter").tablesorter({widgets: ['zebra']});
不工作:
http://hostname/blah?utf8=%E2%9C%93&filter=123&commit=Filter
$("#filter_table").replaceWith("<div id=\"filter_table\"><table class=\"tablesorter\">\n <thead>\n <tr>\n <th class=\"{sorter: \'digit\'}\">One<\/th>\n <th>ID<\/th>\n <th>Person<\/th>\n <th>Person<\/th>\n <th>Two<\/th>\n <th>VID<\/th>\n <th>type<\/th>\n <th>Status<\/th>\n <th>Three<\/th>\n <th>Four<\/th>\n <th>Five<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <tr>\n <td><a href=\"/blah/801\" id=\"801\">801<\/a><\/td>\n <td>Meep<\/td>\n <td>1814<\/td>\n <td>Meep2<\/td>\n <td>Test<\/td>\n <td>Stuff<\/td>\n <td>unknown<\/td>\n <td>submitted<\/td>\n <td>47<\/td>\n <td>16.6<\/td>\n <td>7.9<\/td>\n <\/tr>\n<\/tbody>\n<\/table>\n\n\n\n</div>");
$(".tablesorter").tablesorter({widgets: ['zebra']});
Firebug 显示从 BOTH 调用返回的 Ajax 工作正常,但不知何故,replaceWith
它不适用于从 Filter 表单返回的内容,但对从 Search 表单返回的内容有效。如果您注意到,示例 Ajax 结果完全相同,但不知何故第一个有效,而第二个无效。两者使用相同的index.js.erb
代码。
更新:
我还尝试将上面的 index.js.erb 替换为:
$("#filter_table").empty();
$("#filter_table").append("<div id=\"filter_table\"><%= escape_javascript(render 'list') %></div>");
$(".tablesorter").tablesorter({widgets: ['zebra']});
这以与上述相同的方式工作。即使它们都使用相同且相同的控制器和相同的视图代码并且它们都返回相同的 AJAX 结果,使用text_field_tag
作品的查询和使用 的查询collection_select
也不起作用。index.js.erb
更新2:
使用该collection_select
版本时,在 jquery 行 2215 中返回 AJAX 调用后,我在 firebug 中收到警告。
Use of attributes' specified attribute is deprecated. It always returns true.
return !val || val.specified ? elem.val : elem.text;
我没有通过text_field_tag
AJAX 调用收到此警告。