Rails 4 ajax-request with form_tag

时间:2014-06-24 12:49:35

标签: javascript ruby-on-rails ajax

我正在开发简单的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感到困惑,请澄清我做错了什么。感谢

1 个答案:

答案 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提交按钮上的指示器,正确的方法是将其放在表单标签上。