【问题标题】:Ruby on Rails 4: Display Search Results on Search Results PageRuby on Rails 4:在搜索结果页面上显示搜索结果
【发布时间】:2016-04-07 20:15:38
【问题描述】:

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

已经意识到有关此主题的问题但由于完全无能而无法制定解决方案,我要求您提供最后的指针:)。

搜索表单在条目路径和根路径的索引页面上生成。我想将参数传递到新页面 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 %>

当我将 entry_path 更改为 search_path 时,我收到“很抱歉,出了点问题。如果您是应用程序所有者,请查看日志以获取更多信息。” – 因此,我怀疑这是一个路由问题。但是,我似乎无法弄清楚。日志说:

ActionController::RoutingError (uninitialized constant Entries):

唷,很想知道这里发生了什么!已经非常感谢了。

【问题讨论】:

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


    【解决方案1】:

    您可以使用 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

    【讨论】:

      【解决方案2】:

      更改您的 routes.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 并将它们分派给控制器的操作。它还可以生成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收集路线不会,因为它作用于collectionobjects。有关更多信息 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 删除资源。

      供您参考:

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

      【讨论】:

        猜你喜欢
        • 2012-07-23
        • 2013-12-23
        • 1970-01-01
        • 2014-06-19
        • 1970-01-01
        • 2011-08-25
        • 1970-01-01
        • 2021-08-13
        • 1970-01-01
        相关资源
        最近更新 更多