编辑:经过一些调试后,当我在任何非关联视图(即除了/ search之外的任何视图)时,我的搜索方法看起来都没有被调用。这可能就是为什么我的重定向都没有起作用的原因;它没有被召唤。现在我需要找出原因。
我正在使用Sphinx使用我的Rails应用程序进行全文搜索。总之,在我的application.html.erb布局视图中有一个标题,其中包含一个搜索栏。我可以使用该搜索栏成功搜索给定页面(例如,我可以转到localhost:3000 /搜索和搜索工作),但我无法弄清楚如何使用以便当用户搜索某些内容时任何页面,它们都会定向到包含结果的搜索页面。
从下面的代码中可以看出,我尝试了几种重定向方式:我在我的搜索方法中放了一个redirect_to,并且我已经尝试将它放在respond_to部分。
如何更改我的代码,以便任何页面上的用户都可以在标题中输入搜索字词,并始终将其定向到搜索页面(localhost:3000 / search)及其结果?
我的所有代码都在这里: https://github.com/leesharma/SearchingSandbox
一些关键部分:
routes.rb中:
Blog::Application.routes.draw do
get '/search', :to => 'search#search'
resources :users, :posts
root :to => 'posts#index'
end
rake routes
(来自终端)
search GET /search(.:format) search#search
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
posts GET /posts(.:format) posts#index
POST /posts(.:format) posts#create
new_post GET /posts/new(.:format) posts#new
edit_post GET /posts/:id/edit(.:format) posts#edit
post GET /posts/:id(.:format) posts#show
PUT /posts/:id(.:format) posts#update
DELETE /posts/:id(.:format) posts#destroy
root / posts#index
摘自shared / _header.html.erb:
<div class="small-8 columns">
<%= form_tag :controller => 'search', :action => 'search', :method => 'get', :authenticity_token => false do %>
<%= text_field_tag :search, params[:search] %>
</div>
<div class="small-4 columns">
<%= submit_tag "Search", :name => nil, :class => "button prefix" %>
<% end %>
</div>
search_controller.rb
class SearchController < ApplicationController
def search
@posts = Post.search params[:search]
@users = User.search params[:search]
respond_to do |format|
format.html # search.html.erb
format.json { render json: search_path }
end
end
end
search.html.erb:
<h1>Search Results</h1>
<h2>Listing posts</h2>
<% if @posts %>
<table>
<tr>
<th>Title</th>
<th>Description</th>
<th></th>
<th></th>
<th></th>
</tr>
<% @posts.each do |post| %>
<tr>
<td><%= post.title %></td>
<td><%= post.description.first(500) %></td>
<td><%= link_to 'Show', post %></td>
<td><%= link_to 'Edit', edit_post_path(post) %></td>
<td><%= link_to 'Destroy', post, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</table>
<% else %>
No posts matching your query
<% end %>
<h2>Listing users</h2>
<% if false %> <!-- Leaving this out for now -->
<table>
<tr>
<th>First</th>
<th>Last</th>
<th>Tagline</th>
<th></th>
<th></th>
<th></th>
</tr>
<% @users.each do |user| %>
<tr>
<td><%= user.first %></td>
<td><%= user.last %></td>
<td><%= user.tagline %></td>
<td><%= link_to 'Show', user %></td>
<td><%= link_to 'Edit', edit_user_path(user) %></td>
<td><%= link_to 'Destroy', user, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</table>
<% else %>
No users matching your query
<% end %>
答案 0 :(得分:0)
我认为它不会在您的控制器上调用搜索操作,请尝试更改您的form_tag:
<%= form_tag(search_path, :method => 'get', :authenticity_token => false) do %>
您浏览器上的网址应更改为localhost:3000/search?&utf8&search=something
。
答案 1 :(得分:0)
尝试更改您的表单: -
<%= form_tag( '/search/search', :method => :get ) do %>
<div class="small-8 columns">
<%= text_field_tag :search, params[:search] %>
</div>
<div class="small-4 columns">
<%= submit_tag "Search", :name => nil, :class => "button prefix" %>
</div>
<% end %>
我想,你想在text_field上使用这个bootstrap small-4类,将它包装到你的表单中。
您应该在表单<% end %>
之后关闭div
希望它会有所帮助。谢谢
答案 2 :(得分:0)
我认为问题可能是您的无效HTML - 您在一个div中打开表单标记,然后关闭该div并打开另一个div。最终结果如下:
<div>
<form ...>
</div>
<div>
<input type="submit" />
</form>
</div>
从浏览器的角度来看,提交按钮与您创建的表单标记无关,因为它没有嵌套在其中。您需要重新构建HTML,以便表单标记完全位于单个父元素中。 / p>