th_9plus
@th_9plus (たかちゃん)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ruby on rails コメント投稿実装 エラー

Q&A

Closed

コメント機能を実装したところエラーが出ました。

どこを変えればいいのか分からないので教えて頂きたいです。
よろしくお願い致します。
スクリーンショット 2020-09-06 23.50.38.png

参考にしたサイトはこちらです。
https://qiita.com/__kotaro_/items/8a6bda99dab61d2a72a5

model/posts.rb
class Post < ApplicationRecord

  validates :content, {presence: true, length: {maximum: 140}}
  validates :user_id, {presence: true}
  has_many :comments

  def user
    return User.find_by(id: self.user_id)
  end

end
model/user.rb
class User < ApplicationRecord
  has_secure_password
  validates :name, {presence: true}
  validates :email, {presence: true, uniqueness: true}
  has_many :comments

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



end
model/comment.rb
class Comment < ApplicationRecord
  belongs_to :user
  belongs_to :post, optional: true
end
コントローラーcomments_controller.rb
class CommentsController < ApplicationController

   before_action :authenticate_user!

  def create
    post = Post.find(params[:post_id])
    @comment = post.comments.build(comment_params)
    @comment.user_id = current_user.id
    if @comment.save
      flash[:success] = "コメントしました"
      redirect_back(fallback_location: root_path)
    else
      flash[:success] = "コメントできませんでした"
      redirect_back(fallback_location: root_path)
    end
  end

  private
    def comment_params
      params.require(:comment).permit(:content)
    end
end
posts_controller.rb
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 = @post.users ←ここでエラーが出ます。
    @post = Post.find(params[:id])
    @comments = @post.comments
    @comment = @post.comments.build
  end

  def new
      @post = Post.new
  end

  def create
    @post = Post.new(
      content: params[:content],
      user_id: @current_user.id
      )
    if @post.save
      flash[:notice] = "投稿を作成しました"
     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
   flash[:notice] = "投稿を編集しました"
   redirect_to("/posts/index")
 else
   render("posts/edit")
 end
 end

 def destroy
   @post = Post.find_by(id: params[:id])
   @post.destroy
   flash[:notice] = "投稿を削除しました"
   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
routes.rb
Rails.application.routes.draw do

  get "login" => "users#login_form"


  post "login" => "users#login"
  post "logout" => "users#logout"


  post "users/:id/update" => "users#update"
  get "users/:id/edit" => "users#edit"
  post "users/create" => "users#create"
  get "singnup" => "users#new"
  get "users/index" => "users#index"
  get "users/:id" => "users#show"

  get "posts/index" => "posts#index"
  get "posts/new" => "posts#new"
  get "posts/:id" => "posts#show"

  resources :posts do
    resources :comments, only: [:create]
  end

  post "posts/create" => "posts#create"
  get "posts/:id/edit" => "posts#edit"
  post "posts/:id/update" => "posts#update"
  post "posts/:id/destroy" => "posts#destroy"
  get "/" => "home#top"
  get "about" => "home#about"

end
viwes/posts.show.html.erb
<div class="main posts-show">
  <div class="container">
    <div class="posts-show-item">
      <div class="post-user-name">
        <img src="<%= "/user_images/#{@user.image_name}" %>">
        <%= link_to(@user.name, "/users/#{@user.id}") %>
      </div>
      <p>
        <%= @post.content %>
      </p>

      <div class="post-time">
       <%= @post.created_at %>
       </div>
       <% if @post.user_id == @current_user.id %>
       <div class="post-menus">
        <%= link_to("編集", "/posts/#{@post.id}/edit") %>
        <%= link_to("削除", "/posts/#{@post.id}/destroy", {method: "post"}) %>
      </div>
      <% end %>
    </div>
  </div>
</div>

#これから下がcommentコードです。
<div class="comment-wrapper border-top mb-10">
  <p class="mt-5">コメント一覧</p>
  <% @comments.each do |c| %>
    <div>
      <% unless c.user.blank? %>
        <a href="<%= user_path(c.user_id) %>"><%= image_tag c.user.image.to_s,
          class:"rounded-circle icon_image mr-3 mb-3"%></a>
        <% end %>
      <%= c.user.username unless c.user.blank? %>
      <br />
      <%= c.content %>
    </div>
    <br />
  <% end %>
  <% if user_signed_in? %>
    <%= form_with(model: [@post, @comment], local: true) do |f| %>
      <%= f.text_area :content, class: "form-control", rows: 5 %>
      <%= button_tag type: "submit", class: "btn btn-success float-right mt-1" do %>
        <i class="far fa-comments"></i> コメントする
      <% end %>
    <% end %>
  <% end %>
</div>

スクリーンショット 2020-09-06 23.50.38.png

0

5Answer

posts_controller.rb

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 = @post.users ←ここでエラーが出ます。
+   @user = @post.user
    @post = Post.find(params[:id])
    @comments = @post.comments
    @comment = @post.comments.build
  end
0Like

Comments

  1. @th_9plus

    Questioner

    @tukiyo3 ありがとうございます!
    @user = @post.user でそこのエラーは解決出来ましたが新しくこちらのエラーが出てきました。
    教えて頂きたいです。よろしくお願い致します。

    ```posts_controller.rb
    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 = @post.user
    @post = Post.find(params[:id])
    @comments = @post.comments
    @comment = @post.comments.build ←ここがエラーになりました。
    end
    ```
    ---
    エラー文になります。
    ActiveRecord::StatementInvalid in PostsController#show
    Could not find table 'comments'

もしかして

- @comment = @post.comments.build ←ここがエラーになりました。
+ @comment = @post.comment.build
0Like

Comments

  1. @th_9plus

    Questioner

    @comment = @post.comment.build にしましたがこのようなエラーが出ました。
    エラーの場所は同じです


    NoMethodError in PostsController#show
    undefined method `comment' for #<Post:0x00007f5a80dc6040> Did you mean? comments comments= content

Comments

  1. @th_9plus

    Questioner

    @comment = Comment.new
    @comment = @comments.build
    2つとも同じエラーが出ます。

    ```ActiveRecord::StatementInvalid in PostsController#show
    Could not find table 'comments'
    ```






  2. @th_9plus

    Questioner

    `rails db:migrate` は済んでいます。
  3. @th_9plus

    Questioner

    rm -rf を使って一度ファイルを削除しましたが同じエラーが直りませんどうすれば良いでしょうか?
    エラー文です。

    ActiveRecord::StatementInvalid in PostsController#show
    Could not find table 'comments'

@comment = @post.comments.build ←ここがエラーになりました。
end
エラー文になります。
ActiveRecord::StatementInvalid in PostsController#show
Could not find table 'comments'

Could not find table 'comments'なので、そもそもrails db:migrateしてないとか?

0Like

ページを作成して一連の流れでデバックするより、まずはrails consoleコマンドでREPLを開いてから、一連の流れが正常に動作するか見たほうがデバックしやすいと思います。

$ rails c 
> post = Post.find_by(id: 1234)
> post.comments.build

...

0Like

Comments

  1. @th_9plus

    Questioner

    お返事ありがとうございます。
    ターミナルで一度ファイルを消してまた作り直しましたがAdd devise to usersがdownからupになりません。何故なのでしょうか?


    rails db:migrate:status

    database: db/development.sqlite3

    Status Migration ID Migration Name
    --------------------------------------------------
    up 20200713045244 Create posts
    up 20200716073830 Create users
    up 20200802111950 Add user id to posts
    up 20200802112033 Add password to users
    up 20200802112126 Change users columns
    up 20200802112158 Add image name to users
    up 20200907102132 Create comments
    down 20200908101455 Add devise to users   ←これです。
  2. Add devise to usersのマイグレーションファイルの中身がわからないのでなんとも...

    `rails db:migrate`
    で、何かエラーが出ていませんか?そのエラー内容でgoogleしたら結構すぐに解決できると思います。
  3. @th_9plus

    Questioner

    ```# frozen_string_literal: true

    class AddDeviseToUsers < ActiveRecord::Migration[6.0]
    def self.up
    change_table :users do |t|
    ## Database authenticatable
    t.string :email, null: false, default: ""
    t.string :encrypted_password, null: false, default: ""

    ## Recoverable
    t.string :reset_password_token
    t.datetime :reset_password_sent_at

    ## Rememberable
    t.datetime :remember_created_at

    ## Trackable
    # t.integer :sign_in_count, default: 0, null: false
    # t.datetime :current_sign_in_at
    # t.datetime :last_sign_in_at
    # t.string :current_sign_in_ip
    # t.string :last_sign_in_ip

    ## Confirmable
    # t.string :confirmation_token
    # t.datetime :confirmed_at
    # t.datetime :confirmation_sent_at
    # t.string :unconfirmed_email # Only if using reconfirmable

    ## Lockable
    # t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
    # t.string :unlock_token # Only if unlock strategy is :email or :both
    # t.datetime :locked_at


    # Uncomment below if timestamps were not included in your original model.
    # t.timestamps null: false
    end

    add_index :users, :email, unique: true
    add_index :users, :reset_password_token, unique: true
    # add_index :users, :confirmation_token, unique: true
    # add_index :users, :unlock_token, unique: true
    end

    def self.down
    # By default, we don't want to make any assumption about how to roll back a migration when your
    # model already existed. Please edit below which fields you would like to remove in this migration.
    raise ActiveRecord::IrreversibleMigration
    end
    end
    ```
    rails db:migrateしたらこのエラーが出ました

    StandardError: An error has occurred, this and all later migrations canceled:

    SQLite3::SQLException: duplicate column name: email
  4. @th_9plus

    Questioner

    解決しました!
    皆様アドバイスありがとうございました!!!

Your answer might help someone💌