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

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

ただいまの
回答率

87.60%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 763

score 20

つまずいている事

現在、オリジナルアプリ(バンドメンバーの募集サイト)の作成中で投稿機能の詳細ページを作成している所になります。
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(ユーザー詳細ページで表示される投稿の詳細ページ)

<div>
  <%= link_to gravatar_for(post.user, size: 50), post.user %>
  <span class="name"><%= post.user.name %></span>
  <ul>
    <li>
      Genre:<%= user.posts.genre %>
    </li>
    <li>
      Part:<%= user.posts.part %>
    </li>
    <li>
      Age:<%= user.posts.age %>
    </li>
    <li>Content</li>
    <p>
      <%= user.posts.content %>
    </p>
  </ul>
  <span class="created_at"><%= time_ago_in_words(posts.created_at) %> ago</span>
</div>

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

<% provide(:title, @user.name )%>

<div class="container">
  <div class="row">
    <div class="col-md-3 col-sm-3 col-xs-12 profile">
      <div class="avatar">
        <h1>
          <%= gravatar_for @user %><br>
          <%= @user.name %>
        </h1>
      </div>
      <div class="description">
        <p>
        <%= @user.content %>
        </p>
      </div>
      <div class="info">
        <ul>
          <li>ジャンル:<%= @user.genre %></li>
          <li>パート:<%= @user.part %></li>
          <li>好きなアーティスト:<%= @user.artist %></li>
        </ul>
      </div>
    </div>
    <div class="col-md-9 col-sm-9 col-xs-12 selecter">
      <div class="row bar">
        <div class="col-xs-6 box-btn">
        <%= link_to "post", "#", class: "text" %>
        </div>
        <div class="col-xs-6 box-btn">
        <%= link_to "following", "#", class: "text" %>
        </div>
      </div>
      <div class="col-md-9 col-sm-9 col-xs-12">
        <ol>
        <%= render @post %> #以下のpostパーシャルがレンダリングされる
        <ol>
      </div>
    </div>
  </div>
</div>

_post.html.erb

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

post.rb

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

user.rb

class User < ApplicationRecord
  has_many :posts, dependent: :destroy #postリソースとの関連付け
  attr_accessor :remember_token, :activation_token, :reset_token
  before_save   :downcase_email
  before_create :create_activation_digest
  validates :name,  presence: true, length:{ maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
  validates :email, presence: true, length:{ maximum: 255 },
                    format: {with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensiteive: false }

  has_secure_password
  validates :password, presence: true, length:{ minimum: 6 }, allow_nil: true 

#その他メソッド省略

end

確認したこと

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などを復習して見たものの
一人ではエラーの解決が難しいためどなたかアドバイスをよろしくお願いします。

以上です。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

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/20 08:40 編集

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

    キャンセル

  • 2019/02/20 11:37

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

    キャンセル

  • 2019/02/25 12:25

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

    キャンセル

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

  • ただいまの回答率 87.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る