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

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

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

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

Q&A

解決済

2回答

396閲覧

show(投稿一覧)の viewをプレビューで開くとみれるのに、new(新規投稿)の viewを開くとNoMethodError in Posts#showで開けない

jrjrjr0000

総合スコア13

Ruby on Rails

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

0グッド

1クリップ

投稿2019/02/13 15:32

NoMethodError in Posts#showの解決

まだRuby on Railsを学び始めたばかりの者です。
Ruby on Railsでinstagramのクローンを作る過程で、投稿一覧ページを作成してから新規投稿のページを作ろうとしています。
routes.rbで
get 'posts/:id' => "posts#show"
get 'posts/new' => "posts#new"
と入力し、postsコントローラーで @post = Post.find_by(id: params[:id])と代入してshow.html.erbで<%= @post.content %>と入力し表示するようにしています。
プレビューで"/posts/1"と入力しshow.html.erbの<%= @post.content %>が問題なく表示されるのですが、new.html.erbを'posts/new'で表示すると
NoMethodError in Posts#show
undefined method `content' for nil:NilClass
と表示されます。

'posts/new'を開いているのにshowのことが出てくる原因がわからず、どこに手をつけたらいいのかわかりません。

エラーページには

Request
Parameters:
{"id"=>"new"}
と表示されています

(これはもしかして'posts/new'のnewが:idとして入力されているから、そんなidのcontentないぞってことになっているのでしょうか?)
とても初歩的な質問なのかもしれないのですが、返答をいただけると助かります。
よろしくお願いいたします。

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

NoMethodError in Posts#show Showing /home/ec2-user/environment/sample_app/app/views/posts/show.html.erb where line #2 raised: undefined method `content' for nil:NilClass

該当のソースコード

Ruby

1Extracted source (around line #2): 2 3<%= @post.content %> 4<%= @post.created_at %> 5<%= link_to("編集", "/post/#{@post.id}/edit") %> 6<%= link_to("削除", "/post/#{@post.id}/destroy", {method: "post"}) %>

試したこと

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

Rails 5.2.2
cloud

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

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

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

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

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

guest

回答2

0

get 'posts/new' => "posts#new" get 'posts/:id' => "posts#show"

と変更して'posts/new'が開けるようになりました。

投稿2019/02/22 10:08

jrjrjr0000

総合スコア13

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

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

0

ベストアンサー

routes.rbは先に定義したルーティングが優先されます。

get 'posts/:id' => "posts#show" get 'posts/new' => "posts#new"

この場合、 posts/new でアクセスしても、new:id にマッチしてしまいます。
定義する順番を変えるか、あるいは、

resources :posts

を利用しましょう。


P.S.

undefined method `content' for nil:NilClass

というエラーが出たら、ヌルポです。
どうして、

@post.content

nil.content

になってしまっているのかというのを考えるといいと思います。

投稿2019/02/13 15:49

kouheiszk

総合スコア213

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

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

jrjrjr0000

2019/02/22 10:02

回答ありがとうございました! 以前に学んだ部分でしたが、理解が不十分で見逃していました。 順番を変えると解決しました。 P.S.の部分はコントローラー内の def show @post = Post.find_by(id: params[:id]) end で、paramsでidが取得できなかったため、@post が nil になったという理解であっているでしょうか?
kouheiszk

2019/02/22 12:30

あっています^^
jrjrjr0000

2019/02/22 23:31

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問