我目前正在项目中实现搜索功能,我正在努力在专门的搜索结果页面上显示它。
已经意识到关于这个主题的问题,但由于完全无能而无法找到解决方案,我问你最后的指针:)。
搜索表单在索引页面上生成,该页面是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,很想知道这里发生了什么!非常感谢你们。
答案 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
对象
我所做的改变点:
Rails路由器可识别URL并将其分派给控制器的操作。它还可以生成paths
和URLs
,从而无需在视图中对字符串进行硬编码。
resource
路由将多个相关请求映射到单个控制器中的操作。资源丰富的路由为控制器操作提供HTTP verbs
和URLs
之间的映射。通过约定,每个操作还会映射到数据库中的特定 CRUD
操作。 more information regarding routes
您可以添加适用于collection
或individual 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?
GET
或POST
?有关网络上的GET
和POST
请求以及SO的可用帖子数量。 GET
和POST
都有自己的位置,如果您是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
,因为您已创建