搜索表单重定向到搜索页面

时间:2013-07-29 17:30:56

标签: ruby-on-rails search sphinx thinking-sphinx

摘要

编辑:经过一些调试后,当我在任何非关联视图(即除了/ 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 %>

3 个答案:

答案 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>