我有用户和书籍 - 用户可以是书籍的贡献者。
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 %>`
答案 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
的结果,我会更有力地帮助你!