0

我的视图中有一个 semantic_form_for,它设置了一个搜索过滤器,并通过一个按钮添加了更多过滤器,该按钮通过 JavaScript 添加了更多过滤器。

 <%= semantic_form_for current_coach, :remote => true, :html => { :class => "custom-form rb-form", :id => "filter", :'data-url' => "#{roster_builder_coach_index_path}" } do |f| %>
  <div class="filter_parent_container">
    <% @search.conditions.each do |condition| %>
        <%= render "filter", :condition => condition %>
    <% end %>
  </div>

  <div class="bottom-info">
    <div class="count">
      <p class="num"><%= @athletes.count %></p>
      <p>identified with this filter set</p>
    </div>
    <input type="submit" class="send-request" id="search-button" value="" />
    <input type="button" class="add_filter" value="Add Another Filter" />
  </div>
  <div class="cl">&nbsp;</div>
<% end %>

我需要通过 ajax 提交表单,但事实并非如此。我正在检查控制器中的参数,它们是:

{"action"=>"roster_builder", "controller"=>"coach"}

这是控制器(记录器正在检查参数):

def roster_builder
authorize! :access_roster_builder, current_coach

logger.info("**************");
logger.info("**************");
logger.info("**************");
logger.info("**************");
logger.info("**************");
logger.info(params);
@search = Search.new(sport: current_coach.primary_sport, conditions: params[:search])
@athletes = @search.query.page(params[:page]).per_page(8)

render "athletes" if request.format.js?
end

这是 Ajax 调用:

$("#filter").submit(function(){
  $.ajax({
    url: $("#filter").attr("data-url"),
    type: 'POST',
    success: function(data) {
      $(".results")[0].parentNode.removeChild($(".results")[0]);
    }
  });
});

在我使用 :remote => true 之前,它可以工作,但我需要过滤器(包括通过 JS 添加的过滤器)的持久性,所以我需要 Ajax 来执行搜索而不是刷新页面。既然 Ajax 正在发送表单数据,为什么 params 不能正常工作?我什至尝试通过 Ajax 将数据作为序列化发送,但无济于事,如下所示:

$.ajax({
  url: $("#filter").attr("data-url"),
  type: 'POST',
  data: $("form#filter").serialize(),
  success: function(data) {
    $(".results")[0].parentNode.removeChild($(".results")[0]);
  }
});

任何帮助,将不胜感激!

4

1 回答 1

2
  • 不要remote: true在表单的提交事件中同时使用 AND ajax 调用。

  • 如果您自己调用ajax,那么您肯定需要传递参数data: $("form").serialize()

  • 您必须返回 false,或者在提交事件中执行 e.preventDefault(),因为您实际上并不希望提交表单,因为您自己使用 ajax 调用发送数据。

  • 这个处理 ajax 表单的插件很棒: http: //www.malsup.com/jquery/form/

于 2013-03-14T16:24:04.473 回答