Ruby on Rails 4:在搜索结果页面上显示搜索结果

时间:2016-01-04 08:46:21

标签: ruby-on-rails ruby ruby-on-rails-4

我目前正在项目中实现搜索功能,我正在努力在专门的搜索结果页面上显示它。

已经意识到关于这个主题的问题,但由于完全无能而无法找到解决方案,我问你最后的指针:)。

搜索表单在索引页面上生成,该页面是entries_path和root_path。我想将参数传递给新页面search_path。

以下是我的文件:

EntriesController

def search
end

def index
  @entries = Entry.all.order('entries.created_at DESC')
  @entry = Entry.new # My index page also creates new entries.

  if params[:search]
    @entries = Entry.search(params[:search]).order("created_at DESC")
  else
    @entries = Entry.all.order("created_at DESC")
  end

型号:entry.rb

def self.search(search)
  where("content LIKE ? OR created_at LIKE ?", "%#{search}%", "%#{search}%") 
end

的routes.rb

Rails.application.routes.draw do
  resources :entries 
  root                  'entries#index'  
  get   'new'       =>  'entries/new'
  get   'show'      =>  'entries/show'
  get   'edit'      =>  'entries/edit'
  get   'search'    =>  'entries/search'

最后:索引上的表单

<%= form_tag(entries_path, :method => "get", class: "search-form") do %>
  <%= text_field_tag :search, params[:search], placeholder: "Search for previous entries..", class: "form-control" %>
<% end %>

当我将entries_path更改为search_path时,我得到了一个&#34;我们很抱歉,但出了点问题。如果您是应用程序所有者,请检查日志以获取更多信息。&#34; - 因此,我怀疑这是一个路由问题。但是,我似乎无法弄明白。日志说:

ActionController::RoutingError (uninitialized constant Entries):
P,很想知道这里发生了什么!非常感谢你们。

2 个答案:

答案 0 :(得分:1)

更改 routes.rb

Rails.application.routes.draw do
  root                  'entries#index'
  resources :entries  do
    collection do
      get :search
    end
  end
end

索引页面上更改path表单中的search

<%= form_tag(search_entries_path, :method => :get, class: "search-form") do %>
  <%= text_field_tag :search, params[:search], placeholder: "Search for previous entries..", class: "form-control" %>
<% end %>

更改控制器的方法:

def search
  if params[:search]
    @entries = Entry.search(params[:search]).order("created_at DESC")
  else
    @entries = Entry.all.order("created_at DESC")
  end
end

view/entries/search.html.erb 下为搜索方法创建一个模板 您可以在此处访问 @entries 对象

我所做的改变点:

1。 routes.rb 中的更改:

Rails路由器可识别URL并将其分派给控制器的操作。它还可以生成pathsURLs,从而无需在视图中对字符串进行硬编码。 resource路由将多个相关请求映射到单个控制器中的操作。资源丰富的路由为控制器操作提供HTTP verbsURLs之间的映射。通过约定,每个操作还会映射到数据库中的特定 CRUD 操作。 more information regarding routes

您可以添加适用于collectionindividual members of the collection

的其他路线

例如:

要添加成员路径,只需将成员块添加到资源块中:

resources :entries do
  member do
    get 'preview'
  end
end

添加路径到集合

resources :entries do
  collection do
    get 'search'
  end
end

会员路线需要ID,因为它会对member起作用。 收集路线不会因为它collection objects而起作用。了解更多信息 difference between collection route and member route in ruby on rails?

2。我应该使用哪种方法进行搜索GETPOST

有关网络上的GETPOST请求以及SO的可用帖子数量。 GETPOST都有自己的位置,如果您是Web开发人员,则应了解每个人的利弊。或者,如果你懒得这样做,请记住Search forms should use GET method。您的用户会很感激。 ;)

让我用简短的描述来定义它们。 GET获取资源(当您不想在数据库中进行任何更改时),POST创建资源(当您想在数据库中进行更改/创建时) ,PUT(或PATCH,这是关于此事的辩论)更新资源,DELETE删除资源。

供您参考:

我希望这些信息对您有所帮助。祝你好运:)

答案 1 :(得分:0)

您可以在索引页面上使用html作为搜索字段。

<form>
  <legend>Search</legend>
  <div class='col-xs-4'>
    <input type='text' class='form-control' value='<%= params[:search] %>' name='keyword' placeholder='Keyword' >
  </div>
</form>

注意:此表单将触及条目控制器的索引操作,因此此时无需创建search methods,因为您已创建