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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

Q&A

解決済

2回答

3167閲覧

Rails renderメソッドを用いて別ディレクトリから部分テンプレートを読み込む処理がうまく行かない

Kalkan

総合スコア2

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

0グッド

0クリップ

投稿2021/01/06 10:16

前提・実現したいこと

画像とテキスト投稿アプリにて、ユーザーのマイページにそのユーザーが投稿した画像を一覧表示させるために、別ディレクトリの画像一覧の部分テンプレートをrenderを用いて読み込みたい。

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

投稿一覧ページから、ユーザーのマイページに遷移する際に以下のエラーメッセージが表示される

NameError in Users#show
Showing /projects/protospace-33489/app/views/prototypes/_prototype.html.erb where line #3 raised:

undefined local variable or method `prototype' for #<#Class:0x00007fad0b9fc850:0x00007fad0ba06c38>
Did you mean? @prototypes

該当のソースコード

ruby

1views/prototypes/_prototype.html.erb 2 3<div class="card"> 4 <%= link_to image_tag(prototype.image, class: :card__img ), prototype_path(prototype.id) %> 5 <div class="card__body"> 6 <%= link_to prototype.title , prototype_path(prototype.id), class: :card__title %> 7 <p class="card__summary"> 8 <%= prototype.catch_copy %> 9 </p> 10 <%= link_to "by #{prototype.user.name}", user_path(prototype.user.id), class: :card__user %> 11 </div> 12</div>

ruby

1views/users/show.html.erb 2 3<div class="main"> 4 <div class="inner"> 5 <div class="user__wrapper"> 6 <h2 class="page-heading"> 7 <%= "#{@user.name}さんの情報"%> 8 </h2> 9 省略 10 <div class="user__card"> 11 <%# 部分テンプレートでそのユーザーが投稿したプロトタイプ投稿一覧を表示する %> 12 <%= render "prototypes/prototype", collection: @prototypes %> 13 </div> 14 </div> 15 </div> 16</div>

ruby

1controllers/users_controller.rb 2 3class UsersController < ApplicationController 4 def show 5 @user = User.find(params[:id]) 6 @prototypes = @user.prototypes 7 end 8end

ruby

1controllers/prototypes_controller.rb 2 3class PrototypesController < ApplicationController 4 5 def index 6 @prototypes = Prototype.all 7 end 8 9 def new 10 @prototype = Prototype.new 11 end 12 13 def create 14 prototype = Prototype.new(prototype_params) 15 if prototype.save 16 redirect_to root_path 17 else 18 # なぜこの記述が必要か? 19 @prototype = Prototype.new 20 render action: :new 21 end 22 end 23 24 def edit 25 @prototype = Prototype.find(params[:id]) 26 end 27 28 def update 29 prototype = Prototype.find(params[:id]) 30 if prototype.update(prototype_params) 31 redirect_to action: :show 32 else 33 @prototype = Prototype.find(params[:id]) 34 render :edit 35 end 36 end 37 38 def show 39 @prototype = Prototype.find(params[:id]) 40 @comment = Comment.new 41 @comments = @prototype.comments.includes(:user) 42 end 43 44 def destroy 45 prototype = Prototype.find(params[:id]) 46 prototype.destroy 47 redirect_to root_path 48 end 49 50 private 51 52 def prototype_params 53 params.require(:prototype).permit(:title, :catch_copy, :concept, :image).merge(user_id: current_user.id) 54 end 55end

試したこと

このエラーが最初に発生したときに、usersコントローラーのshowアクションにprototypeのインスタンス変数を記述しておらず、それが原因かと思いましたが解決せず。
他にどのような原因が考えられますか?

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

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

erb

<%= render "prototypes/prototype", collection: @prototypes %>

これは以下と同義なので、prototype変数が用意されていないと言われてしまっています。

rb

1render partial: "prototypes/prototype", locals: { collection: @prototypes }

:collectionキーワードを指定する場合は:partialキーワードを使用してパーシャルファイルを指定する必要があります。

rb

1render partial: "prototypes/prototype", collection: @prototypes

投稿2021/01/06 14:36

Mugheart

総合スコア2349

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

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

Kalkan

2021/01/06 14:58

解決しました! ご回答ありがとうございます!
guest

0

この使い方をしたことがないので、もしかしたら、ですが
render "prototypes/prototype", collection: @prototypes, as: "prototype"
としてみたらどうでしょう。

パーシャル名が "prototype" でなく "prototypes/prototype" とされているのかもしれない、、 という発想です

投稿2021/01/06 11:00

winterboum

総合スコア23567

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

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

Kalkan

2021/01/06 14:57

回答ありがとうございます! 残念ながら不具合は解消しませんでしたが、asという名前を指定できるオプションもあるんですね。勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問