🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1635閲覧

Couldn't find Post with 'id'=showというエラーで困っています

Satochika

総合スコア6

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/12/16 15:53

前提・実現したいこと

views/posts/show.htmlを表示させたいのですが、表題のエラーにより困っています。
Railsで記事の投稿アプリを作っています。
記事の詳細ページを表示する機能を実装中に以下のエラーメッセージが発生しました。

よろしくお願いします。

エラーメッセージ

ActiveRecord::RecordNotFound in PostsController#show Couldn't find Post with 'id'=show Extracted source (around line #51): 49 private 50 def set_params 51 @post = Post.find(params[:id]) 52 end 53 54 def post_params

posts_controller.rb

Ruby

1class PostsController < ApplicationController 2 before_action :set_params, only: [:show, :edit, :update, :destroy] 3 4 def index 5 @posts = Post.all 6 if params[:word].present? 7 @posts = Post.where("body like? or title like ?", "%#{params[:word]}%", "%#{params[:word]}%").order("id desc") 8 else 9 @posts = Post.all.order("id desc") 10 end 11 end 12 13 def show 14 end 15 16 def new 17 @post = Post.new 18 end 19 20 def create 21 @post = Post.new(post_params) 22 # binding.pry 23 if @post.save 24 redirect_to @post, notice: "作成できました" 25 else 26 render :new, alert: "作成できませんでした" 27 end 28 end 29 30 def edit 31 end 32 33 def update 34 if @post.update(post_params) 35 redirect_to @post, notice: "更新できました" 36 else 37 render :edit, alert: "更新できませんでした" 38 end 39 end 40 41 def destroy 42 if @post.destroy 43 redirect_to root_path, notice: "削除に成功しました" 44 else 45 redirect_to @post, alert: "削除できませんでした" 46 end 47 end 48 49 private 50 def set_params 51 @post = Post.find(params[:id]) 52 end 53 54 def post_params 55 params.require(:post).permit(:title, :body, :thumbnail, :latitude, :longitude).merge(user_id: current_user.id) 56 end 57end 58

views/posts/show.html.erb

Html

1<h1>詳細ページ</h1> 2 3 <h2>タイトル</h2> 4 <p><%= @post.title %></p> 5 <h2>本文</h2> 6 <p><%= @post.body %></p> 7 <h2>画像</h2> 8 <%= image_tag @post.thumbnail.url if @post.thumbnail? %> 9 10<%= link_to '編集', edit_post_path(@post)%> 11<%= link_to '削除', post_path(@post), method: :delete, data: {confirm: "削除してもよろしいでしょうか?"}%> 12 13 14<div id='map'></div> 15 16<style> 17#map { 18 height: 400px; 19 width: 70%; 20 margin: 0 auto; 21} 22</style> 23 24<script> 25 26let map 27let geocoder 28const display = document.getElementById('display') 29 30function initMap(){ 31 geocoder = new google.maps.Geocoder() 32 33 map = new google.maps.Map(document.getElementById('map'), { 34 center: {lat: <%= @post.latitude %>, lng: <%= @post.longitude %>}, 35 zoom: 12, 36 }); 37 38 marker = new google.maps.Marker({ 39 position: {lat: <%= @post.latitude %>, lng: <%= @post.longitude %>}, 40 map: map 41 }); 42 43} 44</script> 45<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyAd8V0tsqUsMr8q0BPBANEf0xOQ2Un1YFE&callback=initMap" async defer></script> 46

config/routes.rb

Ruby

1Rails.application.routes.draw do 2 devise_for :users 3 root to: 'posts#index' 4 resources :users 5 resources :posts 6 resources :categories 7 resources :hashtags 8 resources :images 9 resources :likes 10 resources :preservations 11end 12

試したこと

viewファイルの@postを@posts.idとしましたが変わりませんでした。
恐らくparams[:id]の中身が空だと言われているのだと思います。
そこでコンソールでparams[id]と入力したところ、

Uncaught ReferenceError: params is not defined at <anonymous>:1:1

と返ってきました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

show ってのはアクション名で
resources で生成したルートだと普通 show という文字は URL には入りません
詳しくはRails のルーティングを見てください

show は個々のインスタンスの詳細を表示するものなので
show だけだとどのインスタンスを表示するかがわからないですよね

なので GET /posts/:id というURLで表示できます
なのに /posts/show というURLでアクセスしてしまうと
show という文字列がIDとして認識されてしまうのでそんなインスタンスはありませんというエラーになります

というか show をいきなりURLをたたいて表示させることは普通ないと思うので
index に一覧を表示させて1つを選択して詳細に飛ぶ感じが普通です

投稿2020/12/16 17:14

編集2020/12/16 17:15
mypt

総合スコア170

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問