关于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后
答案 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
这仍然是部分解决方案,因为当用户输入搜索字符串但没有结果时你必须处理这种情况,但这会让你开始。