konchanxxx / menta

MENTAのタスク管理用リポジトリ
0 stars 0 forks source link

検索機能の追加について #27

Closed sumura80 closed 5 years ago

sumura80 commented 5 years ago

概要

現在作成中のアプリに検索機能を追加したい。 どのような機能で実装するのが最良の方法か見極めたい。 また実務ではどのような方法を使われているのか知りたいです。

困っていること

以前、Elasticsearchというgemを利用しアプリを作成する練習をしたがHerokuにはaddonなしではあげられなかったので、今回はどのような検索方法を追加すれば良いか困っている。 下記の方法が今の所調べた中での候補です。 1.Ruby on Rails チュートリアル http://railstutorial.jp/chapters/following-users?version=4.0#sec-search

2.Ransack gemを使用 3.ElasticsearcをaddonのBonsai Elasticsearchを使用

ご教示いただけませんでしょうか?よろしくお願いいたします。:bow:

konchanxxx commented 5 years ago

2.のransackで良いかなと思いました:bow: Elasticsearchは本番でも運用される本格的なものなので検索フォームを実装してみたいくらいの要件ならransackで十分かと思います:bow:

sumura80 commented 5 years ago

@rexitorg さん gemの選定に関するアドバイスありがとうございました。:bow: 下記のサイトを元に、Ransackというgemを使いナビゲーションバーに検索ボタンをつけることにしました。 https://qiita.com/fujitora/items/b2134bf6abcfda79c47f

その際に、Application_controller(全画面で検索ができるよう)にアクションを追加しました。Postの名前(:title)を元に検索をかけようと思っています。

ここで、検索結果を新しく検索結果画面(/search)を作成しそこに表示したいと思っています。そこで、コントローラに、 redirect_to search_path を追加し画面遷移してそこで結果を表示しようとしました。

def search
  #random 原型=> @search = Article.search(params[:q])
   @query = Post.ransack(params[:q]) #ransackメソッド推奨
   @search_posts = @query.result
   redirect_to search_path
 end

Routeも追加しました。:arrow_down:

app/config/route.rb
get 'search', to:'layouts#search'

rake routes の結果は下記の通りです。:arrow_down:

search GET    /search(.:format)    applications#search

しかしこのやり方だと、application_controllerに記述した redirect_to search_path のために画面がエラーになります。:x: どのようにして、ナビゲーションバーのSubmitを押して、検索結果画面(/search)を表示させて検索結果も表示すればよろしいでしょうか?(posts/indexは使いません)

ransack

よろしくお願いいたします。:bow:

下記がソースコードになります。 https://github.com/sumura80/med_plus_bs4_updated_master/pull/15

/app/db/seeds.rbにテストデータも保存しておきました。

User.create(email: 'admin@com',username: 'tester',admin: 'true', password: 'password')
User.create(email: 'test@com',username: 'tester',admin: 'false', password: 'password')
Category.create(name:"Pain Relief")
Post.create(category_id: 2, title: 'Sample med', active_regular: 'bespoke XOXO slow-carb selvage lumbersexual wayfarers jean shorts irony cardigan fingerstache kombucha.', user_id: 1, image: open("./app/assets/images/sample_med_01.jpg"))
sumura80 commented 5 years ago

@rexitorg さん お疲れ様です。内容を少し修正してみたのですが、ransack gemの設定中でエラーがでしまいます。:sob:

検索対象のモデルとひも付きが強いControllerのPostコントローラにメソッドを設置してみました。 app/controllers/posts_controller

class PostsController < ApplicationController
     # before_action :search
     before_filter :set_search

    def search
      #これ原型=> @search = Article.search(params[:q])
      @query = Post.ransack(params[:q]) #ransackメソッド推奨
      @search_posts = @query.result(distinct: true)
      render 'search'
    end

end

Routeも下記のように設定いたしました。:arrow_down:

#ransackを使った検索結果表示の画面search
get 'search', to: 'posts#search'

Viewは下記の通りです。:arrow_down: app/views/posts/search.html.erb

<% @search_posts.each do |article| %>
  <p><%= article %></p>
<% end %>

これが今エラーになってしまっております。:disappointed_relieved: app/views/layouts/_header.html.erb

<!-- Search box -->
<form class="form-inline my-2 my-lg-0">
  <%= search_form_for @query, url: search_path do |f| %>
    <%= f.text_field :title_cont ,placeholder: 'Search',class:"form-control mr-sm-2" %>
    <%= f.submit "Submit" , class: 'btn btn-outline-success my-2 my-sm-0'%>
  <% end %>
</form>

結構記事を探しているのですが、検索をする以前の問題です・・・ No Ransack::Search object was provided to search_form_for! no ransack

念のためコードを下記に保存いたしました。:arrow_down: https://github.com/sumura80/med_plus_bs4_updated_master/pull/15

ご助言頂ければ幸いです。よろしくお願いいたします。

konchanxxx commented 5 years ago

def searchって検索結果表示ですよね?フォームを表示するにはヘッダーを表示する際にインスタンスが存在する必要があるのでトップページを表示するアクションの中でransackオブジェクトを初期化しておく必要があるのかなと思いました。

https://qiita.com/nishina555/items/2c1f8bae980e426519bc

でもフォームを表示するindexアクションでインスタンスを初期化していると思います:bow:

sumura80 commented 5 years ago

@rexitorg こちら無事にRansackを実装できました。:smiley: ありがとうございました。:bow:

クローズさせていただきます。