0

概括

编辑:经过一些调试,当我在任何非关联视图(即除 /search 之外的任何视图)上时,似乎甚至没有调用我的搜索方法。这可能就是为什么我的重定向都不起作用的原因;它没有被调用。现在我需要弄清楚为什么。

我正在使用 Sphinx 对我的 Rails 应用程序进行全文搜索。总之,在我的 application.html.erb 布局视图中有一个标题,其中有一个搜索栏。我可以使用该搜索栏在给定页面上成功搜索(例如,我可以转到 localhost:3000/search 并且搜索有效),但我不知道如何做到这一点,以便当用户从任何页面,它们都会被定向到包含结果的搜索页面。

正如您从下面的代码中看到的那样,我尝试了几种重定向方式:我已经在我的搜索方法中放置了一个 redirect_to 并且我已经尝试将它放在 response_to 部分中。

问题

如何更改我的代码,以便任何页面上的用户可以在标题中输入搜索词并始终将其结果定向到搜索页面 (localhost:3000/search)?

代码

我所有的代码都在这里: https ://github.com/leesharma/SearchingSandbox

一些关键部分:

路线.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 %>
4

3 回答 3

0

我相信它没有在您的控制器上调用搜索操作,请尝试更改您的 form_tag:

<%= form_tag(search_path, :method => 'get', :authenticity_token => false) do %>

浏览器上的 URL 应更改为localhost:3000/search?&utf8&search=something.

于 2013-07-29T17:45:55.033 回答
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 类,把它包装到你的表单中。您应该在表单后关闭 div<% end %> 希望它会有所帮助。谢谢

于 2013-07-29T19:13:18.333 回答
0

我认为问题可能是您的无效 HTML - 您在一个 div 中打开表单标签,然后关闭该 div 并打开另一个。最终结果是这样的:

<div>
  <form ...>
</div>
<div>
  <input type="submit" />
  </form>
</div>

从浏览器的角度来看,提交按钮与您创建的表单标签无关,因为它没有嵌套在其中。您需要重新构建 HTML 以便表单标签完全位于单个父元素中。

于 2013-07-30T00:25:26.333 回答