rails4将搜索引擎放入主页面

时间:2014-07-28 05:34:30

标签: ruby-on-rails ruby search

关于ransack的铁路广播教程,我能够在我的帖子页面上创建搜索引擎。但是,我想在Welcome#index(main)页面上实现相同的搜索引擎。我尝试过同样的方式,但每当我点击搜索时,它都会返回到欢迎#index页面而不是搜索帖子页面:(我是新来的ruby on rails :(

这是我的帖子控制器:

 class PostsController < ApplicationController
     before_action :set_post, only: [:show, :edit, :update, :destroy, :vote]
     skip_before_filter :verify_authenticity_token, :only => [:edit, :update, :destroy, :vote]
 # GET /posts
 # GET /posts.json
    def index
      @search = Post.search(params[:q])
      @posts = @search.result
      @posts = @search.result(:distinct => true)
      @search.build_sort if @search.sorts.empty?

     respond_to do |format|
      format.html 
      format.json{ render json: @posts}
     end
   end

 private
   # Use callbacks to share common setup or constraints between actions.

  def set_post
    @post = Post.find(params[:id])
  end

  # Never trust parameters from the scary internet, only allow the white list through.
  def post_params
    params.require(:post).permit(:area, :price, :people, :size, :description, :image)
  end
 end

发布index.html.erb:

<%= search_form_for @search do |f| %>
  <div class="field">
  <h1>Search</h1>
    <%= f.label :area_cont, "area" %>
    <%= f.text_field :area_cont, class: "area_search"%>
  </div>

  <div class="post_actions">
   <%= f.submit "Search", class: "btn btn-warning" %>
   <%= link_to "Clear Search", request.path, class: "btn btn-primary" %>
  </div>

 <% end %>

欢迎#索引

        <p>
            <form class="navbar-search pull-left">
                <%= search_form_for @search do |f| %>
                  <div class="field">
                  <h1>Search</h1>
                    <%= f.label :area_cont, "area" %>
                    <%= f.text_field :area_cont, class: "area_search"%>
                  </div>

                  <div class="post_actions">
                  <%= f.submit %>
                  <%= link_to "Clear Search", request.path, class: "btn btn-primary" %>
                  </div>
                <% end %>
            </form>
        </p>

欢迎控制器

class WelcomeController < ApplicationController
 def index
   @search = Post.search(params[:q])
   @posts = @search.result
   @posts = @search.result(:distinct => true)
   @search.build_sort if @search.sorts.empty?

   respond_to do |format|
    format.html 
    format.json{ render json: @posts}
  end
end
end

我刚上传了与此问题相关的部分:(如果代码的其他部分是必要的,请告诉我!!谢谢!

这是我的欢迎#index.html.erb: 我已经删除了欢迎控制器中的内容

<div id="headerwrap">
    <div class="container">
        <div class="row centered">
            <div class="col-lg-8 col-lg-offset-2">
            <h1>search</b></h1>
            <p>
                <form class="navbar-search pull-left">
                    <%= form_tag("/posts", method: "GET") do %>
                    <%= label_tag(:q, "Search for:") %>
                    <%= text_field_tag(:q) %>
                    <%= submit_tag("Search") %>
                    <% end %>
                 </form>
            </p>
           </div>
          </div><!-- row -->
      </div><!-- container -->
     </div><!-- headerwrap -->

运行bundle exec后

enter image description here

2 个答案:

答案 0 :(得分:0)

基于你的PostsController代码。 你可以试试这个。

欢迎#index.html.erb中的表单应包含q param 例如,

<%= form_tag(search_posts_path, method: "GET") do %>
  <%= label_tag(:q, "Search for:") %>
  <%= text_field_tag(:q) %>
  <%= submit_tag("Search") %>
<% end %>

您的欢迎控制器索引操作可以为空。因为表格搜索通过帖子控制器索引动作。

class WelcomeController < ApplicationController
 def index
 end
end

还有其他方法来处理这个问题,例如将帖子控制器索引作为根(或者你会调用主页)然后在有搜索参数时调用搜索方法,将q参数传递给欢迎索引操作然后重定向发布行动的参数等。

答案 1 :(得分:0)

welcome#index会继续为您渲染,因为在搜索结果中,您永远不会告诉Rrails不要这样做。
因此,您分享的WelcomeController代码段应如下所示:

class WelcomeController < ApplicationController
 def index
   @search = Post.search(params[:q])
   @posts = @search.result
   @posts = @search.result(:distinct => true)
   @search.build_sort if @search.sorts.empty?

   if @posts.count > 0
     # If we have any matches, render the posts/index view.
     render 'posts/index'
   else
    respond_to do |format|
     format.html 
     format.json{ render json: @posts}
    end
   end
 end
end

这仍然是部分解决方案,因为当用户输入搜索字符串但没有结果时你必须处理这种情况,但这会让你开始。