Ruby on Rails 4:在搜索结果页面上显示搜索结果
我目前正在项目中实现搜索function,我正在努力在专门的搜索结果页面上显示它。
已经意识到关于这个主题的问题,但由于完全无能而无法找到解决方案,我问你最后的指针:)。
搜索表单在索引页面上生成,该页面是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'
最后:关于索引的表格
"get", class: "search-form") do %>
当我将entries_path更改为search_path时,我收到了“我们很抱歉,但出了点问题。如果您是应用程序所有者,请查看日志以获取更多信息。” – 因此,我怀疑这是一个路由问题。 但是,我似乎无法弄明白。 日志说:
ActionController::RoutingError (uninitialized constant Entries):
P,很想知道这里发生了什么! 非常感谢一堆。
改变你的路线.rb
Rails.application.routes.draw do root 'entries#index' resources :entries do collection do get :search end end end
在索引页面上更改search
表单中的path
:
<%= 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并将它们分派给控制器的动作。 它还可以生成paths
和URLs
,从而无需在视图中对字符串进行硬编码。 resource
路由将许多相关请求映射到单个控制器中的操作 。 资源丰富的路由提供HTTP verbs
和URLs
与控制器操作之间的映射。 按照惯例 ,每个操作还映射到数据库中的特定CRUD
操作。 有关路线的更多信息
您可以添加适用于collection
其他路径或collection
individual members of the collection
。
对于Eg:
要添加成员路由 ,只需将成员块添加到资源块中:
resources :entries do member do get 'preview' end end
要添加到集合的路由:
resources :entries do collection do get 'search' end end
成员路由将需要ID
,因为它作用于member
。 收集路径不是因为它作用于objects
collection
。 有关收集路线和ruby在轨道上的成员路线之间的区别的更多信息?
2.我应该使用哪种方法进行搜索GET
或POST
?
网上有关于GET
和POST
请求的post数量以及SO。 GET
和POST
都有自己的位置,如果你是Web开发人员,你应该了解每个人的优缺点 。 或者,如果你懒得这样做,请记住搜索表单应该使用GET方法 。 您的用户会很感激。 ;)
让我用简短的描述来定义它们。 GET
获取资源(当你不想在数据库中进行任何更改时), POST
来创建资源(当你想在数据库中进行更改/创建时), PUT
(或PATCH
,这些是关于此事)更新资源, DELETE
删除一个。
供你参考:
- 你什么时候使用POST,什么时候使用GET?
我希望这些信息可以帮助你。 祝好运 :)
您可以在索引页面上使用html作为搜索字段。
注意:此表单将触及条目控制器的索引操作,因此此时无需创建已创建的search methods