【问题标题】:rails search form that works on all pages of application适用于所有应用程序页面的 Rails 搜索表单
【发布时间】:2013-08-16 10:49:28
【问题描述】:

我有一个显示在所有页面上的搜索表单,因为我希望某人能够搜索并被重定向到搜索结果,而不管他们在网站的哪个位置。为了实现这一点,我将表单放在我包含在应用程序布局中的部分中。看起来是这样的

<form class="form-search center">
 <%=form_tag search_url, method: :get do%>
 <%=text_field_tag :query, params[:query] ,{:class=>"input-xxlarge search-query"}%>
 <button type="submit" class="btn">Search</button>
<%end%>
</form>

我创建了一个名为 SearchResults 的控制器,它带有一个索引操作来显示结果。 命名路由如下所示

match '/search',  to: 'search_results#index'

搜索在搜索页面上工作得很好,但在其他任何地方都不能工作。我的索引操作看起来像这样

class SearchResultsController < ApplicationController
 def index
  @restaurants =  Restaurant.text_search(params[:query]).page(params[:page]).per_page(3)

 end
end 

无论我在应用程序中的哪个位置,我都希望能够在执行搜索时重定向到此操作。text_search 方法在餐厅模型中定义,如下所示

def self.text_search(query)
if query.present?
  where("restaurant_name ilike :q or description ilike :q", q: "%#{query}%")

else
  scoped    
end

这不起作用,因为当我搜索时没有任何反应,但如果我进入搜索页面,它会返回结果。

我注意到了一些有趣的事情。当我从主页搜索诸如吃之类的术语时。网址看起来像这样localhost:3000/?utf8=✓&amp;query=eats,当我从完美运行的真实搜索页面搜索时,它看起来像这样localhost:3000/search?utf8=✓&amp;query=eats。无论从哪里搜索,我怎样才能让它指向后一个 url?

【问题讨论】:

  • “不能在其他地方工作”是什么意思?你有错误吗?这是什么错误?
  • 它不显示结果但似乎重定向。
  • 您没有显示您的视图,但我怀疑未设置值 params[:querey]params[:page] 之一。你检查了吗?
  • 你应该在index action 中做的是这个render js: "window.location = '#{search_path}'",因为它可能无法将流扔到那个特定的url,所以你可以像这样强制它。它不是一个确定的解决方案,但值得一试。
  • 为什么form里面有一个form

标签: ruby-on-rails search ruby-on-rails-3.2


【解决方案1】:

这是因为您有一个嵌套表单。

<form class="form-search center">
  <%=form_tag search_path do%>

去掉原始 HTML 中的 form,让 Rails 通过第二行中的帮助程序生成它。

【讨论】:

    【解决方案2】:

    你为什么不为你的搜索控制器做一个正确的路由条目?

    resources :search_results, :only => :index
    

    然后在您的搜索表单中将其发布到searches_path。那么你就不必摆弄这个:match 路由了。

    编辑

    我还注意到您GET 您的表单。从技术上讲,这并不重要,但它不是很干净。所以也许,你可以这样做:

    resources :searches_results do
      post :query
    end
    

    然后在您的控制器中,您只需拥有query 函数。

    编辑 2

    而且我认为这里真正的问题是您在表单标签中有一个表单标签。第一个表单标签被评估,它可能指向/。因此它可以在控制器本身中工作,但不能在其他任何地方工作。

    【讨论】:

    • 是的,问题出在嵌套表单上。关于当前没有结果时如何显示消息的任何想法,它什么都不显示。
    • 在你看来你可以做类似if @restaurants.size == 0
    【解决方案3】:

    对于我的情况,我使用这样的东西:在视图中

    <%= form_tag url_for(:controller => '/searchresults', :action => 'index')  , :method => 'get' do %>
      <%= text_field_tag :query, params[:query] ,{:class=>"input-xxlarge search-query"} %>
      <%= submit_tag 'search' %>
    <% end %>
    

    在模型中

      q = "%#{params[:query]}%"
      where("restaurant_name LIKE ? or description LIKE ?", q, q)
    

    【讨论】:

    • 试过了。带来这个错误。 ActionController::RoutingError at / No route matches {:controller=&gt;"search"}
    • 哎呀,我忘了检查你的控制器名称:controller =&gt; '/your_controller_name'这是对你错误的回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2016-04-08
    • 1970-01-01
    • 2012-02-27
    • 2012-02-03
    相关资源
    最近更新 更多