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

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

詳細はこちら
Ruby on Rails

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

リダイレクト

プログラムの入力元や出力先を通常とは別の場所に転送させることをリダイレクトと呼びます。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Q&A

解決済

1回答

3306閲覧

rails renderを用いて読み込んだビュー内のインスタンス変数が空になってしまっている

Kalkan

総合スコア2

Ruby on Rails

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

リダイレクト

プログラムの入力元や出力先を通常とは別の場所に転送させることをリダイレクトと呼びます。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

0グッド

0クリップ

投稿2021/01/07 11:04

前提・実現したいこと

プロトタイプという画像とテキストをあわせたものを投稿できる機能を持ったアプリを作成しています。
投稿されたプロトタイプの詳細ページにて他のユーザーがその投稿にコメントするという機能の中で、コメントが正しく保存されればそのページにリダイレクトして、失敗すればrenderを用いてそのページに留まるという条件分岐を設定したいのですが、失敗したときのrenderの処理がうまくいきません。

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

NoMethodError in Comments#create undefined method `title' for nil:NilClass エラー発生箇所はビューファイル内のインスタンス変数が記述されている場所だと表示されています。

該当のソースコード

app/controllers/comments_controller.rb

rb

1class CommentsController < ApplicationController 2 def create 3 @comment = Comment.new(comment_params) 4 if @comment.save 5 # コメントが保存された場合の処理 6 redirect_to "/prototypes/#{@comment.prototype.id}" 7 else 8     # コメントの保存に失敗した場合の処理 9 render "prototypes/show" 10 end 11 end 12 13 private 14 def comment_params 15 params.require(:comment).permit(:text).merge(user_id: current_user.id, prototype_id: params[:prototype_id]) 16 end 17end

app/controllers/prototypes_controller.rb

rb

1class PrototypesController < ApplicationController 2 before_action :move_to_index, except: [:index, :show, :new, :create] 3 before_action :authenticate_user!, except: [:index, :show] 4 5# 省略 6 7 # プロトタイプの詳細ページを表示させるshowアクション 8 def show 9 @prototype = Prototype.find(params[:id]) 10 @comment = Comment.new 11 @comments = @prototype.comments.includes(:user) 12 end 13 14 def destroy 15 prototype = Prototype.find(params[:id]) 16 prototype.destroy 17 redirect_to root_path 18 end 19 20# 省略

app/views/prototypes/show.html.erb

erb

1<main class="main"> 2 <div class="inner"> 3 <div class="prototype__wrapper"> 4 <p class="prototype__hedding"> 5 <%= @prototype.title %>  # この行がエラー発生箇所 6 </p> 7 <%= link_to "by #{ @prototype.user.name }", user_path(@prototype.user.id), class: :prototype__user %> 8 <% if user_signed_in? && current_user.id == @prototype.user_id %> 9 <div class="prototype__manage"> 10 <%= link_to "編集する", edit_prototype_path, class: :prototype__btn %> 11 <%= link_to "削除する", prototype_path, method: :delete, class: :prototype__btn %> 12 </div> 13 <% end %> 14 <div class="prototype__image"> 15 <%= image_tag(@prototype.image) %> 16 </div> 17 <div class="prototype__body"> 18 <div class="prototype__detail"> 19 <p class="detail__title">キャッチコピー</p> 20 <p class="detail__message"> 21 <%= @prototype.catch_copy %> 22

試したこと

[エラーから読み取れること]
ビューファイルで使われるインスタンス変数が空になってしまっているため、ビューを表示させることができない

showアクション内でインスタンス変数を記述しているのに、なぜ変数が空になってしまっているのか分かりません。

どこに間違いがあるのかご教授していただけると幸いです。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

インスタンス変数はインスタンスが消えるとなくなります。
コントローラーのインスタンスは、アクションの処理が終わると役割が終わるので消えます。
show で作成したインスタンス変数は prototypes/show.html.erb の処理を終えたら消えるので、class CommentsController#create の時にはありません。
else      # コメントの保存に失敗した場合の処理 render "prototypes/show"
のrenderの前に@prototypeを定義してください

投稿2021/01/07 11:53

winterboum

総合スコア23567

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

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

Kalkan

2021/01/08 02:26

ご回答ありがとうございます! ``` @prototype = Prototype.find(params[:prototype_id]) @comment = Comment.new @comments = @prototype.comments.includes(:user) render "prototypes/show" ``` 言われたとおり、@prototype変数を定義することにより不具合が解消しました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問