【问题标题】:Creating site-wide search in a Rails app在 Rails 应用程序中创建站点范围的搜索
【发布时间】:2016-02-10 11:03:13
【问题描述】:

我正在尝试创建一个搜索表单,该表单可以根据用户对餐厅名称的查询来检索结果。到目前为止,我已经设置了它的路由、控制器和index 视图。

routes.rb

resources :search, :only => [:index]

search_controller.rb

class SearchController < ApplicationController
  def index
    if params[:query].present?
      @restaurants = Restaurant.search(params[:query])
    else
      @restaurants = Restaurant.all
    end
 end
end

搜索/index.html.erb

<% @restaurants.each do |restaurant| %>
    <%= restaurant.name %>
<% end %>

以下是设置搜索的方式:


layouts/_header.html.erb

<%= form_for search_index_path, method: :get do |f| %>
  <%= text_field_tag :query, params[:query] %>
  <%= submit_tag "Search", name: nil %>
<% end %>

现在我遇到了两个问题。第一个是如果我输入查询并提交,页面不会转到索引页面。它所做的只是将查询附加到我所在的当前页面:

localhot:3000/restaurant?utf8=✓&query=pizza

其次,我在索引页面上获取了我的数据库中的每家餐厅(如预期的那样)。有没有一种方法可以让页面在搜索请求之外的任何内容都是空白的?

【问题讨论】:

  • 当您输入localhost:3000/search 时,它会点击您的search/index.html.erb 页面吗? localhost:3000/restaurant 与您的问题有什么关系?
  • 是的。我也会在我的帖子中提到这一点,但如果我在 localhost:3000/search 并输入我的查询,它将获取结果。但如果我在localhost:3000/restaurants/search 以外的页面上,我会将其添加到我的网址末尾而不是搜索:utf8=✓&amp;query=pizza
  • 1) 您是否尝试过使用form_tag 而不是form_for 2) 在else 代码路径中:@restaurants = [] 而不是@restaurants = Restaurant.all
  • @markets 哇...我觉得我搜索了整个互联网并做了除了这两个建议之外的所有事情。感觉将其发布为答案,我会将其标记为正确。谢谢!

标签: ruby-on-rails forms search controller


【解决方案1】:

问题 1

使用form_tag 而不是form_for,因为后者用于处理特定的模型对象,而事实并非如此。

问题 2

您可以通过以下方式实现:

if params[:query].present?
  @restaurants = Restaurant.search(params[:query])
else
  @restaurants = [] # or Restaurant.none if you need a chainable scope
end

【讨论】:

    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 2019-01-22
    • 2021-12-31
    相关资源
    最近更新 更多