Rails - 包括新对象形式的搜索字段

时间:2014-09-01 08:46:49

标签: ruby-on-rails forms ruby-on-rails-4

我有用户和书籍 - 用户可以是书籍的贡献者。

User has_many :contributions
Book has_many :contributions
Contribution belongs_to :user, belongs_to :book

我有一个新的贡献表单 - /contributions/new.html.erb和一个问题:我想为用户使用搜索字段,但搜索字段的submit_tag正在提交整个表单。我的代码如下。如何使搜索submit_tag只在搜索字段上运行?

<h1>New contribution</h1>

<%= form_for(@contribution) do |f| %>
  <% if @contribution.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@contribution.errors.count, "error") %> prohibited this contribution from being saved:</h2>

      <ul>
      <% @contribution.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
     <%= f.select :contribtype, options_for_select(Contribution::CONTRIB_TYPES) %>
  </div>

  <div class="field">
    <%= f.label :user_id %><br>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag "Search", :name => nil %>
    <% if @users %>
      <% @users.each do |user| %>
        <%= render partial: 'layouts/bookshelf', locals: {user: user} %>
      <% end %>
    <% end %>
  </div>

  <div class="field">
    <%= f.label :book_id %><br>
    <%= f.number_field :book_id %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>`

1 个答案:

答案 0 :(得分:1)

<强>表单

您提交整个表单的原因&#34;是因为how HTML handles forms

每当你提交&#34;在表单中,它将使用其父<form>标记中的元数据将您的数据发送到服务器端点。您遇到的问题是,您正试图在表单中创建表单,而该表单根本无法正常工作

解决方案是使用Ajax分别处理search功能:


<强>的Ajax

#your_form
<%= form_for(@contribution) do |f| %>
   ...
   <%= text_field_tag :search, params[:search], id: "search" %>
   <%= link_to "Search", contribution_search_path, it: "search_submit" %>
   ...
<% end %>

你必须设计&#34;搜索&#34;链接作为远程ajax请求 - 允许您将params发送到您的服务器:

#app/assets/javascripts/application.js.erb
$(document).on("click", "a#search_submit", function(){
   $.ajax({
      url: $(this).attr("href"),
      data: {query: $("#search").val() },
      success: function(data) {
         // do what you want here
      }
   });
});

这将允许您process the "search" request asynchronously加载页面范围,绕过HTML表单问题,从而为您提供所需的功能


<强>更新

路径问题将由我引用可能不存在的路径引起。您必须使用以下内容:

#config/routes.rb
resources :contributions
   get :search, on: :collection
end

如果你这样做&amp;让我知道rake routes的结果,我会更有力地帮助你!