前提・実現したいこと
Rails6で小説や漫画、映画のレビューアプリを制作しています。
検索機能を導入したく、参考サイト(https://qiita.com/nojinoji/items/e1b174220da8c81a1756)をもとにransackをインストールして作業を進めていたのですが、エラーが発生しました。
コードが足りない場合はお手数ですがコメントお願いします。追加いたします。
自分の力ではどうにもなりません、、。ご教授お願いします。
発生している問題・エラーメッセージ
NoMethodError in Home#search Showing /Users/*****/test_app/app/views/home/search.html.erb where line #2 raised: undefined method `posts_path' for #<#<Class:0x00007fb85f1c8f80>:0x00007fb85f1eb3f0> Did you mean? top_path
該当のソースコード
Ruby
1#home/search.html.erb 2 3<body> 4 <%= search_form_for @q do |f| %> 5 <%= f.label :title, "Keyword" %> 6 <%= f.search_field :title_cont %> 7 <%= f.submit "検索" %> 8 <% end %> 9</body>
Controller
Ruby
1 2#posts_controller 3 4class PostsController < ApplicationController 5 protect_from_forgery except: :update 6 before_action :ensure_correct_user,{only: [:edit,:update,:destroy]} 7 8 9 def show 10 @id = params[:id] 11 @post = Post.find_by(id: params[:id]) 12 @user = User.find_by(id: @post.user_id) 13 end 14 15 def edit 16 @post = Post.find_by(id: params[:id]) 17 end 18 19 def update 20 @post = Post.find_by(id: params[:id]) 21 @post.title = params[:title] 22 @post.content = params[:content] 23 @post.workname = params[:workname] 24 @post.author = params[:author] 25 @post.style = params[:style] 26 @post.save 27 redirect_to("/") 28 end 29 30 def destroy 31 @post = Post.find_by(id: params[:id]) 32 @post.destroy 33 redirect_to("/") 34 end 35 36 def ensure_correct_user 37 @post = Post.find_by(id:params[:id]) 38 unless @post.user_id == current_user&.id 39 flash[:notice] = "権限がありません" 40 redirect_to("/posts/index") 41 end 42 end 43end
Ruby
1#home_controller 2 3class HomeController < ApplicationController 4 def review 5 @post = Post.all.order(created_at: :desc) 6 end 7 8 def search 9 @q = Post.ransack(params[:q]) 10 @post = @q.result(distinct: true) 11 end 12end
postモデル
Ruby
1#post.rb 2 3class Post < ApplicationRecord 4 belongs_to :user 5 6 validates :title, presence: true, length: { in: 3..50 } 7 validates :content, presence: true, length: { in: 10..20000 } 8 validates :workname, presence: true 9 validates :author, presence: true 10end
routes
Ruby
1#routes.rb 2 3Rails.application.routes.draw do 4 5 #-順番変えちゃダメ--------------------------------------- 6 7 # 新規登録・ログイン後のページを指定 8 root to: "home#top" 9 10 # ログイン、アカウント編集後、任意のページに推移させるための記述 11 devise_for :users, :controllers => { 12 :registrations => 'users/registrations', 13 :sessions => 'users/sessions' 14 } 15 16 devise_scope :user do 17 get "signup", :to => "users/registrations#new" 18 get "login", :to => "users/sessions#new" 19 get "logout", :to => "users/sessions#destroy" 20 get 'users/:id/setting', to: 'users/registrations#edit' 21 patch 'users/:id/update', to: 'users/registrations#update' 22 end 23 24 resources :users, only: [:show] 25 26 #---------------------------------------------------- 27 28 # ホームページ 29 get '/' => "home#top" 30 31 # 検索ぺージ 32 get 'search' => "home#search" 33 34 35 # 新規投稿関係 36 get 'newpost' => "login_user#newpost" 37 post 'create' => "login_user#create" 38 get 'created' => "login_user#postcreate" 39 40 # 投稿詳細ページ 41 get 'post/:id' => "posts#show" 42 43 # 投稿編集ページ 44 get 'post/:id/edit' => "posts#edit" 45 post 'post/:id/update' => "posts#update" 46 47 # 投稿削除ページ 48 delete 'post/:id/destroy' => "posts#destroy" 49 post 'post/:id/destroy' => "posts#destroy" 50 51 52 #アカウント編集ページ 53 get 'users/:id/account/edit' => "users#edit" 54 55 # ユーザー詳細ページ 56 get 'users/:id' => "users#show" 57 58 # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html 59end 60
試したこと1
これまで何度かこの”undefined method `post_path' for”に出会ったことがあり、その都度post_pathに変更したらうまくいっていたのですが、今回はうまくいきません。
また、routes.rbにresources :postsを記入するという解決策も試してみたのですが、下記のような画面が出てしまいます。
試したこと2
一番はじめに作成したpostコントローラーが単数形だったのがまずかったのかと思い、postsコントローラーを作り内容をコピペ&ルーティングのpostをすべてpostsに書き換えました。
何も変わっていないような気がします。
回答2件
あなたの回答
tips
プレビュー