我正在开发简单的Web界面服务,它可以与数据库进行交互,并且可以按参数过滤项目。 以下是代码示例:
配置/ routes.rb中
resources :list_items do
collection do
get 'filter'
end
end
应用程序/视图/ list_items / index.html.erb
<%= form_tag(filter_list_items_path, method: 'get') do %>
<%= text_field_tag(:some_parameter) %>
<%= submit_tag 'Filter', remote: true %>
<% end %>
<table>
<%= render @list_items %>
</table>
部分app / views / list_items / _list_item.erb
<tr class="<%= cycle('list_line_odd', 'list_line_even') %>" id="listElement">
<td><%= list_item.attributes[:path] %></td>
</tr>
app / controllers / list_items_controller.rb
def filter
@list_items ||= filter_items(params) #get @list_items array, according to params
respond_to do |format|
format.js
end
end
应用程序/视图/ list_items / filter.js.erb
$('#listElement').html('<%= escape_javascript render(@list_items) %>');
当我将数据输入到text_field并按“过滤器”按钮时,它会调用list_items控制器中的过滤器操作。我希望只刷新表内容,但不会抛出错误ActionController::UnknownFormat
。
P.S。当我在format.html { redirect_to list_items_url }
块中添加行respond_to
时,它不会抛出错误而不会应用过滤器。
我对rails感到困惑,请澄清我做错了什么。感谢
答案 0 :(得分:1)
这种情况正在发生,因为表单提交的是html格式,这是Rails中的默认格式,这就是format.html
响应的原因,但是因为它返回html而不是javascript没有任何反应。
您收到UnknownFormat
错误,因为在您的操作中,您只接受format.js
阻止中的respond_to
。
要解决此问题,请尝试将表单更改为以下内容:
<%= form_tag(filter_list_items_path(format: :js), method: 'get', remote: true) do %>
<%= text_field_tag(:some_parameter) %>
<%= submit_tag 'Filter' %>
<% end %>
在上面的代码中,我们告诉rails明确地将表单提交为js
格式,因此这将生成一个带有.js
后缀的路由,而不是放置remote
提交按钮上的指示器,正确的方法是将其放在表单标签上。