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

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

ただいまの
回答率

87.49%

Rubyでのbuildメソッドについて

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,221
退会済みユーザー

退会済みユーザー

Ruby (on rails)で投稿にコメントを付けようとしています。
それで以下の@commentを作成したのですが、buildメソッドでエラーが発生してしまいます。
参考:https://qiita.com/tsuchinoko_run/items/d671ea840bc0bfa90186

エラー: unknown attribute 'post_id' for Comment.
Request: Parameters: {"id"=>"15"}

(post_controller.rb)
  def show
    @post = Post.find_by(id: params[:id])
    @user = @post.user
    @likes_count = Like.where(post_id: @post.id).count
    @comment = @post.comments.build
  end

post_idは@likes_countで使っているので関係ないと思うのですが。。。
ちなみに@commentを削除するとエラーは発生しません。

どなたか直し方を教えていただけないでしょうか。
よろしくお願いします。

以下、追記。

(schema.rb) (変更後)
ActiveRecord::Schema.define(version: 2020_01_01_011953) do

  create_table "comments", force: :cascade do |t|
    t.string "content"
    t.integer "post_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["post_id"], name: "index_comments_on_post_id"
  end

  create_table "likes", force: :cascade do |t|
    t.integer "user_id"
    t.integer "post_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "posts", force: :cascade do |t|
    t.text "content"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "user_id"
    t.string "post_image_name"
  end

  create_table "users", force: :cascade do |t|
    t.string "name"
    t.string "email"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "image_name"
    t.string "password_digest"
  end

end
(schema.rb)
class CreateComments < ActiveRecord::Migration[5.2]
  def change
    create_table :comments do |t|
      t.string :content
      t.references :posts, foreign_key: true

      t.timestamps
    end
  end
end
(comment.rb)
class Comment < ApplicationRecord
  belongs_to :posts
  validates :content, presence: true
end
(comments_controller.rb)
class CommentsController < ApplicationController
private
  def content_params
    params.require(:comment).permit(:content)
  end

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

  def destroy
    post = Post.find(params[:post_id])
    @comment = post.comments.find(params[:id])
    @comment.destroy
    redirect_back(fallback_location: image_path(post)
  end
end
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

+1

@post.comments.build が動くにはいくつか条件があります

  1. model Comment と model Postが関係つけられていること
    具体的には
    class Comment に belongs_to :post があること
    class Post に had_many :commentsがあること
  2. そのために必要なcolumnが定義されていること
    具体的には model Comment に post_id があること

post.comments そのものでは そんなmethodないよエラーがでていないので、1はクリアしていて、2がないということがわかります

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/01/01 22:56

    なるほど!
    ご回答ありがとうございました!

    キャンセル

  • 2020/01/01 23:23

    すみません、上記のschema.rbのように変更しましたが、同じエラーが返ってしまっています。
    t.integer "posts_id" => t.integer "post_id"
    t.index ["posts_id"], name: "index_comments_on_post_id" => t.index ["post_id"], name: "index_comments_on_post_id"

    エラーメッセージも同じで、「unknown attribute 'post_id' for Comment.」です。

    キャンセル

  • 2020/01/02 06:54

    schema.rbを直してもDBが治るわけではないです。schema.rbはDBの状態を取って来ているだけです。
    rename_column を実行するmigrationを作製するか、
    posts_idになってるmigretionを直して、DBを作りなおす(データ全部消える)かしてください

    キャンセル

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

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

関連した質問

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