从"home page"到其他型号/控制器的 Rails 4 搜索



更新4-6-2015:

在此处仔细检查:https://github.com/activerecord-hackery/ransack

为了确保我做的一切都是正确的,除了我想我会做的一些打嗝。我不清楚自动魔术是如何或是什么让f.submit在模型中没有填写任何内容的情况下将用户快速转移到模型索引,索引操作主持(因此,在进行搜索后,我会进入组的索引视图(我正在搜索的内容),并显示数据库中的所有内容,就好像Group.all被调用时完全忽略了搜索字符串(我可以在地址栏中看到)一样。

真的不确定我错过了什么,我确信这对我来说是微不足道的愚蠢。

编辑/更新:所以我完成了大部分工作,搜索屏幕将转到那个控制器。我不确定是什么原因导致了这种情况,我认为我的respons_to可以捕获并发送回json,所以我可以通过ajax调用来更新主页中的表。然后,如果他们点击该表,就会进入该特定项目的编辑表单(即正确模型的编辑)。我的visitor_controller.rb:

 def index              
     @search = Group.ransack(name_cont: params[:q])
     @groups = @search.result
      respond_to do |format|
       format.html 
       format.js
     end 
end

也添加路由文件:

Rails.application.routes.draw do
  resources :groups
  get 'visitors', to: 'visitors#index'
  root to: 'visitors#index'
end

因此,群组是我试图搜索的一个控制器/模型(其中之一,当我首先找到一个时,将使用答案中的示例进行多次搜索。)

所以我正在构建一个应用程序,我发现了rails4:的"简单搜索"教程

http://www.stefanosioannou.com/rails-4-simple-search-form/

但我认为这是假设你从视图/模型和你的控制器中进行搜索。即。我在群组视图中,我想通过该控制器搜索我的群组。

实际上,我正在做的是有一个欢迎页面,里面有三个搜索栏,我觉得很难做到。每个栏搜索不同的模型/视图/控制器。

欢迎页面被称为访问者,有自己的控制器,只查看没有模型。

所以我的访客控制器有这个:

class VisitorsController < ApplicationController
  def index
     @groups = Group.search(params[:gsearch])
      respond_to do |format|
       format.html 
       format.js
     end 
  end
end

我只是想让一个搜索栏为我的Group模型工作,所以在我的Visitors index.html.erb:中

<div class="span12">
<h3>Welcome IPA of NM</h3>
<!-- search bar here -->
 <% form_tag group_path, :method => 'get' do %>
    <p>
        <%= text_field_tag :gsearch, params[:search] %>
        <%= submit_tag "Search Groups", :name => nil %>
    </p>
<% end %>
</div>

正如所说,这是失败的

No route matches {:action=>"show", :controller=>"groups"} missing required keys: [:id]

这是我的群组控制器:

class GroupsController < ApplicationController  
    before_action :set_group, only: [:show, :edit, :update, :destroy]
    def show
    end
 private
     # Use callbacks to share common setup or constraints between actions.
     def set_group
       @group = Group.find(params[:id])
     end
end

我确信访问者index.html.erb中的表单代码以某种方式与该group_path一起工作,这意味着它正在尝试表演,但刚开始时还没有ID?我真的迷路了,刚接触铁路,不知道我在这里错过了什么。我猜惯例是从你的模型/视图/控制器做所有事情,而不是像我在这里试图做的那样进行交叉视图?所以我必须做一些额外的事情来绕过大会,或者我从一开始就做错了所有的事情?

对于rails中的搜索查询,我强烈建议使用Ransack。您可以在此处查看>https://github.com/activerecord-hackery/ransack你还可以在http://railscasts.com/episodes/370-ransack

Ransack全面工作,你甚至可以从同一表格中搜索所有3个模型。

使用transak,您只需使用:

<%= search_form_for @q do |f| %>
  # Search if the models name field contains...
  <%= f.label :name_cont %>
  <%= f.search_field :name_cont %>
  <%= f.submit %>
<% end %>

然后搜索控制器将其处理为@results:

  def index
        @q = params[:q]
        @search = Model.search(name_cont: @q)   
        @results = @search.result
    end

然后,您将在您的节目/索引页面上循环查看结果。

<% @results.each do |result| %>
    <%= result.name
<% end %>

这将在一个搜索页面上显示您的所有结果。如果你想搜索多个模型,你可以让多个表单为每个模型分配一个不同的实例变量,例如:@q1 @q2 @q3,或者,你可以通过使用不同实例变量进行搜索和结果来从一个模型中搜索所有模型。例如

def index
    @q = params[:q]
    @firstsearch = User.search(username_cont: @q)
    @secondsearch = Post.search(title_or_description_cont: @q)
    @users = @firstsearch.result
    @posts = @secondsearch.result
end

记住添加路线=)

get 'search', to: 'search#index'

最新更新