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

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

ただいまの
回答率

89.10%

投稿とユーザー画像の紐付けが上手くできません

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 245

akairen

score 18

Ruby(Rails)初学者で初めてのオリジナルアプリを作成しているのですが投稿とユーザー画像の紐付けで下記のようなエラーが出てしまい解決できずにいます

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

NoMethodError in Posts#show
Showing /Users/kuritahajime/pile_up_app/app/views/posts/show.html.erb where line #6 raised:

undefined method `image_name' for nil:NilClass

該当のソースコード

**controllers - posts_controller.rb**


def show
    @post = Post.find_by(id: params[:id])
    # 変数@userを定義してください
    @user = User.find_by(id: @post.user_id)

  end
**posts - show.html.erb**

<div class="user-wrapper">
      <div class="cont">

        <div class="user-left">
          <div class="user-img">
            <img src="<%= "/user_images/#{@user.image_name}" %>">
          </div>

          <div class="user-profile">
            <div class="user-name">
              <h3>赤井れん</h3>
            </div>

            <% if @user.id == @current_user.id %>
              <%= link_to("編集", "/#{@user.id}/edit") %>
            <% end %>

            <div class="user-time">
              <p>積み上げ総時間</p>
              <h2>62時間40分</h2>
            </div>
            <div class="user-day">
              <p>積み上げ日数</p>
              <h2>42日</h2>
            </div>

          </div>
        </div>


    <div class="user-right">
         <div class="user-contents">

            <div class="user-title">
              <h2>あなたの積み上げ</h2>
            </div>

            <% @posts.each do |post| %>

            <div class="user-content">
              <p class="time">30分</p>
              <p class="content">Rails学習</p>
              <p class="matter"><%= post.content %></p>
              <% if @post.user_id == @current_user.id %>
              <%= link_to("編集", "/posts/#{@post.id}/edit") %>
              <%= link_to("削除", "/posts/#{@post.id}/destroy",{method:"post"}) %>
              <% end %>
            </div> 

            <% end %>

          </div>
        </div>
    </div>


</div>
**controllers - users_controller.rb**

def create
        @user = User.new(
        name: params[:name],
        email: params[:email],
      # 引数を追加し、初期画像が設定されるようにしてください
        image_name: "pile-up3.jpg",
        password: params[:password]
        )

        if @user.save
          session[:user_id] = @user.id
          redirect_to("/users/#{@user.id}")
        else
            render("users/new")

        end

    end

試したこと

過去にProgateで同じようなことをやった記憶があり、確認してみたところProgateの9章で投稿(posts)とユーザー(users)を紐付けるというものがあったので、それを参考にしつつ所々コピペしてみたのですが上手くできませんでした

↓Progate9章 投稿とユーザーを紐付けよう↓

https://prog-8.com/rails5/study/9/4#/11

追記(modelのコード)

**model - user.rb**


class User < ApplicationRecord
  # has_secure_passwordメソッドを追加してください
  has_secure_password

  validates :name, {presence: true}
  validates :email, {presence: true, uniqueness: true}


  has_many :posts

  def posts
    return Post.where(user_id: self.id)
  end

end
**model - post.rb**

class Post < ApplicationRecord
    validates :content, {presence: true ,length:{maximum:140}}
    validates :user_id,{presence:true}

    belongs_to :user
end

postの編集機能の部分のコードです↓

**contorollers - post_controller**

class PostsController < ApplicationController

  before_action :authenticate_user

  before_action :ensure_correct_user,{only:[:edit,:update,:destroy]}

  def index
    @posts = Post.all.order(created_at: :desc)
  end

  def show
    @post = Post.find_by(id: params[:id])
    # 変数@userを定義してください
    @user = User.find_by(id: @post.user_id)

  end

  def new
    @post = Post.new
  end

  def create
    @post = Post.new(
      content:params[:content],
      user_id: @current_user.id
    )
    if @post.save
      redirect_to("/posts/index")
    else
      render("posts/new")
    end
  end



  def edit
    @post = Post.find_by(id: params[:id])
  end

  def update
    @post = Post.find_by(id: params[:id])
    @post.content = params[:content]

    if @post.save
      redirect_to("/posts/index")

    else
      render("posts/edit")
    end
  end

  def destroy
    @post = Post.find_by(id: params[:id])
    @post.destroy
    redirect_to("/posts/index")
  end

  def ensure_correct_user
    @post = Post.find_by(id: params[:id])
    if @post.user_id != @current_user.id
      flash[:notice]= "権限がありません"
      redirect_to("/posts/index")
    end
  end

end
**new.html**
<div class="edit-wrapper">
      <div class="cont">
        <div class="edit-wrapper-main">
          <div class="edit-title">
           <h1>今日の積み上げ</h1>
          </div>
          <div class="edit-contents">

            <div class="edit-content edit-1">
              <p>今日の積み上げ時間</p>
              <p><textarea class="edit-time" type="text" name="" value="">   </textarea></P>
            </div>

            <div class="edit-content edit-2">
              <p>今日やったこと</p>
              <textarea class="edit-thing" type="text" name="" value="">   </textarea>
            </div>

            <div class="edit-content">
              <p>具体的な内容</p>
              <%= form_tag("/posts/create") do %>
              <textarea name="content" rows="8" cols="80"> <%= @post.content %> </textarea>
              <% end  %>
            </div>



          </div>
          <input class="edit-submit" type="submit" name="" value="投稿">
        </div>
      </div>
    </div>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

@userがnil(該当するUserが居なかった)ためのエラーです。

def show
    @post = Post.find_by(id: params[:id])
    # 変数@userを定義してください
    @user = User.find_by(id: @post.user_id)
end


の @post.user_id が実在のUser id になっていないためでしょう。
rails 5 からはそうならないようになっているのですが、なにかしてしまってますね。
User と Psot の関連の定義を見せてください。
belongs_to とか has_many とかのことです

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/14 21:52

    作り直しというのは Post のデータです。
    rails c で入って、 Post.delete_all すると全部消えますので、
    それから新たに Post のデータを作ってください

    キャンセル

  • 2020/01/14 22:00

    Post.delete_allした結果、エラーが解消されました。ありがとうございます。
    私の知識や理解力が不足していてかなりお手間を取らせてしまい申し訳ありませんでした

    キャンセル

  • 2020/01/14 22:28

    良かったです。
    同じ内容の二つの質問も解決済みにしておいてkださい

    キャンセル

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

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