質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

977閲覧

【Rails】form_withを使用し検索機能を実装中ですが、検索結果が表示されずに困っています。

kema

総合スコア6

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/10/19 04:21

編集2020/10/20 22:37

前提・実現したいこと

ruby on railsでブログを投稿できるサイトを制作です。
そこで投稿した記事の内容を検索する機能を実装したいと思っています。
検索フォームの作成の前提として

  • form_withを使用している
  • railsの基本アクション以外でseachという命名でアクションを定義している
  • 検索の条件は記事のテキストを含む投稿にしている
  • 検索機能の実装前に簡単なタグ付け機能を実装しています

です。

  • 検索フォームは全てのページに表示させたいのでapplication.html.rbに記述しています
  • ブートストラップ4を使用しています

プログラミングについての理解がまだ浅く、自分で調べてみたのですが解決に至れませんでした。
初めての質問で至らぬところも多々あると思いますが、どうか力をお貸しください。

発生している問題・エラーメッセージ

検索したい文字を入力して検索ボタンを押しても画面が検索結果のページに遷移しない。
エラーメッセージは表示されません。

該当のソースコード

ルーティング

ruby

1config/routes.rb 2 3Rails.application.routes.draw do 4 devise_for :users 5 root to: 'posts#index' 6 resources :posts do 7 resources :comments, only: :create 8 collection do 9 get 'search' 10 end 11 end 12 resources :users, only: :show 13end

コントローラー

ruby

1 2app/controllers/posts_controller.rb 3 4def search 5 @posts = Post.search(params[:keyword]) 6 7-- ここより下は検索機能の実装時に記述しました -- 8 9 return nil if params[:input] == "" 10 tag = Tag.where(['name LIKE ?', "%#{params[:input]}%"] ) 11 render json:{ keyword: tag } 12 end

モデル

bury

1app/models/post.rb 2 3class Post < ApplicationRecord 4 5 has_many :post_tag_relations 6 has_many :tags, through: :post_tag_relations 7 belongs_to :user 8 has_one_attached :image 9 has_many :comments 10 11 def self.search(search) 12 if search != "" 13 Post.where('text LIKE(?)', "%#{search}%") 14 else 15 Post.all 16 end 17 end 18end

ビュー画面(検索フォーム)

<form class="form-inline my-2 my-lg-0"> <%= form_with(url: search_posts_path, local: true, method: :get) do |form| %>   <%= form.text_field :keyword, placeholder: "投稿を検索する", class: "form-control mr-sm-2" %>  <%= form.submit "検索", class: "nav-alink btn btn-outline-secondary mr-2" %> <% end %> </form>

ビュー画面(検索結果)

<div class="contents row"> <% @post.each do |post| %> <div class="col-md-4 mt-5"> <div class="card text-center"> <%= image_tag post.image, size: "100x200", class: "card-img-top" %> <h4 class="card-text"><%= post.title %></h4> <p class="card-text text-truncate"><%= post.text %></p> <ul class="tag"> <li class="tag-list"> <% post.tags.each do |tag| %> #<%=tag.name%> <%end%> </li> </ul> <%= link_to "詳細ページへ", post_path(post.id), method: :get, class: "btn btn-outline-secondary btn-block" %> </div> </div> <% end %> </div>

試したこと

Railsアプリに検索機能を実装する方法をわかりやすくまとめてみた。を参考にし、form_withではなくてform_tag を使用してやってみましたがやはり画面の遷移ができませんでした。

URLから直接検索結果の画面に移動すると、投稿した記事の内容が全て文字列として表示されている状態です。

知識不足なので的を外した質問かもしれませんが、前に進めずに困っております。

知恵を貸していただけると本当にありがたいです。

補足情報(FW/ツールのバージョンなど)

ruby_version 2.6.5

Rails 6.0.3.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決いたしました。
postコントローラーのsearchアクションにタグ付け機能のインクリメンタルサーチと検索機能2つの定義をしていたのが原因でした。

修正前

app/controllers/posts_controller.rb def search @posts = Post.search(params[:keyword]) -- ここより下は検索機能の実装時に記述しました -- return nil if params[:input] == "" tag = Tag.where(['name LIKE ?', "%#{params[:input]}%"] ) render json:{ keyword: tag } end

修正後

def search @posts = Post.search(params[:keyword]) end -- インクリメンタルサーチのアクションの名前はtagに変更 -- def tag return nil if params[:input] == "" tag = Tag.where(['name LIKE ?', "%#{params[:input]}%"] ) render json:{ keyword: tag } end

投稿2020/10/21 22:11

kema

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問