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

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

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

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

Ruby

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

Ruby on Rails

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

Q&A

解決済

1回答

411閲覧

postとuserリソースの関連付けがうまくいかない

iyore888

総合スコア40

Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

0グッド

1クリップ

投稿2019/02/17 14:05

編集2019/02/17 14:17

#つまずいている事
現在、オリジナルアプリ(バンドメンバーの募集サイト)の作成中で投稿機能の詳細ページを作成している所になります。
postとuserリソースを関連付けして投稿詳細ページの内容を表示したいのですがうまくいかず、
試行錯誤しており助けて頂けると大変有り難いです。。

#発生しているエラー
NameError in Posts#show
Showing /home/ec2-user/environment/band_app/app/views/posts/show.html.erb where line #2 raised:

undefined local variable or method `post' for #<#Class:0x00007fcd0f372290:0x00007fcd0f3705d0>

※以下投稿詳細ページコードの2行目、postがローカル変数もしくはメソッドとして認識されていることが問題のようです。

#show.html.erb(ユーザー詳細ページで表示される投稿の詳細ページ)

ruby

1<div> 2 <%= link_to gravatar_for(post.user, size: 50), post.user %> 3 <span class="name"><%= post.user.name %></span> 4 <ul> 5 <li> 6 Genre:<%= user.posts.genre %> 7 </li> 8 <li> 9 Part:<%= user.posts.part %> 10 </li> 11 <li> 12 Age:<%= user.posts.age %> 13 </li> 14 <li>Content</li> 15 <p> 16 <%= user.posts.content %> 17 </p> 18 </ul> 19 <span class="created_at"><%= time_ago_in_words(posts.created_at) %> ago</span> 20</div>

show.html.erb(ユーザー詳細ページ)

ruby

1<% provide(:title, @user.name )%> 2 3<div class="container"> 4 <div class="row"> 5 <div class="col-md-3 col-sm-3 col-xs-12 profile"> 6 <div class="avatar"> 7 <h1> 8 <%= gravatar_for @user %><br> 9 <%= @user.name %> 10 </h1> 11 </div> 12 <div class="description"> 13 <p> 14 <%= @user.content %> 15 </p> 16 </div> 17 <div class="info"> 18 <ul> 19 <li>ジャンル:<%= @user.genre %></li> 20 <li>パート:<%= @user.part %></li> 21 <li>好きなアーティスト:<%= @user.artist %></li> 22 </ul> 23 </div> 24 </div> 25 <div class="col-md-9 col-sm-9 col-xs-12 selecter"> 26 <div class="row bar"> 27 <div class="col-xs-6 box-btn"> 28 <%= link_to "post", "#", class: "text" %> 29 </div> 30 <div class="col-xs-6 box-btn"> 31 <%= link_to "following", "#", class: "text" %> 32 </div> 33 </div> 34 <div class="col-md-9 col-sm-9 col-xs-12"> 35 <ol> 36 <%= render @post %> #以下のpostパーシャルがレンダリングされる 37 <ol> 38 </div> 39 </div> 40 </div> 41</div> 42

#_post.html.erb

ruby

1<li class="post_li"> 2 <%= link_to gravatar_for(post.user, size: 50), post.user %> 3 <span class="name"><%= post.user.name%></span><br> 4 <%= link_to post_path(post.id) do %><span class="subject"><%= post.subject %></span><% end %><br> 5 <span class="created_at"><%= time_ago_in_words(post.created_at) %> ago</span> 6</li>

#post.rb

ruby

1class Post < ApplicationRecord 2 belongs_to :user #userリソースとの関連付け 3 default_scope -> { order(created_at: :desc) } 4 validates :content, presence: true, length: {maximum: 140 } 5 validates :user_id, presence: true 6end 7

#user.rb

ruby

1class User < ApplicationRecord 2 has_many :posts, dependent: :destroy #postリソースとの関連付け 3 attr_accessor :remember_token, :activation_token, :reset_token 4 before_save :downcase_email 5 before_create :create_activation_digest 6 validates :name, presence: true, length:{ maximum: 50 } 7 VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(.[a-z\d\-]+)*.[a-z]+\z/i 8 validates :email, presence: true, length:{ maximum: 255 }, 9 format: {with: VALID_EMAIL_REGEX }, 10 uniqueness: { case_sensiteive: false } 11 12 has_secure_password 13 validates :password, presence: true, length:{ minimum: 6 }, allow_nil: true 14 15#その他メソッド省略 16 17end 18

#確認したこと
user.rb(has_many :posts)とpost.rb(belongs_to :user)の関連付けはできているので
以下のような記述が可能となるはずである

post.user  postに紐付いたUserオブジェクトを返す
user.posts  Userのマイクロポストの集合をかえす
user.posts.create(arg)  userに紐付いたマイクロポストを作成する
user.posts.create!(arg)  userに紐付いたマイクロポストを作成する (失敗時に例外を発生)
user.posts.build(arg)  userに紐付いた新しいpostオブジェクトを返す
user.posts.find_by(id: 1)  userに紐付いていて、idが1であるマイクロポストを検索する

#お願い
rails tutorialなどを復習して見たものの
一人ではエラーの解決が難しいためどなたかアドバイスをよろしくお願いします。

以上です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

<%= link_to gravatar_for(post.user, size: 50), post.user %>
のエラーのようですが、undefined local variable or method 'post' for...ということで、postが無いと言われています。
post.useruserが無いのであれば関連付けの問題ですが、postであれば単にその変数が存在しないというエラーです。
そのviewの中でpostは定義されていますか?postではなく、@postではないですか?

投稿2019/02/18 00:17

Kta-M

総合スコア456

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

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

iyore888

2019/02/19 23:41 編集

コメントありがとうございます。 数日寝込んでおり回答遅くなり申し訳ありません。。 ご指摘の点含め確認をしてみましたが、 よくよく確認をしてみると上記のpostsフォルダ直下の_post.html.erbファイルにもpost.userを用いた関連付けをしていますがそちらは問題なく表示されておりました。 そのため今は何故、同フォルダ直下のshow.html.erbファイルでは適用されないのかに詰まっている次第です。。
Kta-M

2019/02/20 02:37

<%= render @post %> という書き方を初めて見ました。。 ちょっと調べてみてもそんな使い方は見当たらないので正しい書き方なのか分からないのですが、 動作しているのであれば、状況から推測するに <%= render partial: post, locals: {post: @post} %> と同等の動きをしているのではないかと思います。 そのため、postが使えているのではないかと。
iyore888

2019/02/25 03:25

なかなか解決せず後回しにしておりましたが、 ご指摘の通りブラウザで確認したところ @postでレンダリングされていたところは <%= render partial: post, locals: {post: @post} %>という記述に置き換わっていたことがわかりました。 そのため_post.html.erbでは変数の定義が不要になっていたようです。 今回はshow.html.erbに改めて@post変数を定義することによって解決できました。 有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問