Rails 4从"主页"到其他型号/控制器

时间:2015-03-30 20:40:40

标签: ruby-on-rails-4

更新2015年4月6日:

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

确保我把一切都做对了,除了我认为我做的几次打嗝。我不清楚自动化是如何或者什么使得用户将用户带到那个模型索引而没有填写该模型中的任何内容,并且索引操作占据了总数(因此在进行搜索之后将我带到组的索引视图(我正在搜索的内容)并显示db中的所有内容,就好像Group.all被称为忽略搜索字符串(我可以在地址栏中看到)一样。

真的不确定我错过了什么我确信这对我来说是个愚蠢的事。

编辑/更新:所以我完成了大部分工作,搜索屏幕将转到该控制器。我不确定是什么自动化导致这种情况,我认为我的respond_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

因此,群组是我正在尝试搜索的控制器/模型(其中一个,当我让第一个工作时,将使用答案中的示例执行许多操作。)

所以我正在构建一个应用程序,我找到了一个简单的搜索" rails 4的教程:

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

我只是想让一个搜索栏为我的群组模型工作,所以在我的访问者中有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,这意味着它正在尝试执行一个show但刚启动时还没有ID?我真的迷路了,对rails4不熟悉并且不确定我在这里缺少什么。我猜这个约定是从你的模型/视图/控制器做所有事情而不是我想在这里做的交叉视图?所以我必须做些额外的事情才能绕过约定,或者我从一开始就做错了?

1 个答案:

答案 0 :(得分:1)

我强烈推荐Ransack用于rails中的搜索查询。你可以在这里查看&gt; https://github.com/activerecord-hackery/ransack你也可以观看Ryan Bates在http://railscasts.com/episodes/370-ransack

投射的精彩导轨

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

使用ransack,您只需使用:

<%= 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

然后,您将遍历show / index页面上的结果。

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

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

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

请记住添加routes =)

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