🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Q&A

1回答

813閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

1グッド

1クリップ

投稿2020/01/01 02:04

編集2020/01/01 14:36

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

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

Ruby

1(post_controller.rb) 2 def show 3 @post = Post.find_by(id: params[:id]) 4 @user = @post.user 5 @likes_count = Like.where(post_id: @post.id).count 6 @comment = @post.comments.build 7 end

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

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

以下、追記。

Ruby

1(schema.rb) (変更後) 2ActiveRecord::Schema.define(version: 2020_01_01_011953) do 3 4 create_table "comments", force: :cascade do |t| 5 t.string "content" 6 t.integer "post_id" 7 t.datetime "created_at", null: false 8 t.datetime "updated_at", null: false 9 t.index ["post_id"], name: "index_comments_on_post_id" 10 end 11 12 create_table "likes", force: :cascade do |t| 13 t.integer "user_id" 14 t.integer "post_id" 15 t.datetime "created_at", null: false 16 t.datetime "updated_at", null: false 17 end 18 19 create_table "posts", force: :cascade do |t| 20 t.text "content" 21 t.datetime "created_at", null: false 22 t.datetime "updated_at", null: false 23 t.integer "user_id" 24 t.string "post_image_name" 25 end 26 27 create_table "users", force: :cascade do |t| 28 t.string "name" 29 t.string "email" 30 t.datetime "created_at", null: false 31 t.datetime "updated_at", null: false 32 t.string "image_name" 33 t.string "password_digest" 34 end 35 36end

Ruby

1(schema.rb) 2class CreateComments < ActiveRecord::Migration[5.2] 3 def change 4 create_table :comments do |t| 5 t.string :content 6 t.references :posts, foreign_key: true 7 8 t.timestamps 9 end 10 end 11end

Ruby

1(comment.rb) 2class Comment < ApplicationRecord 3 belongs_to :posts 4 validates :content, presence: true 5end

Ruby

1(comments_controller.rb) 2class CommentsController < ApplicationController 3private 4 def content_params 5 params.require(:comment).permit(:content) 6 end 7 8 def create 9 post = Post.find(params[:post_id]) 10 @comment = post.comments.build(comment_params) 11 if @comment.save 12 flash[:success] = "コメントしました" 13 redirect_back(fallback_location: image_url(post.id)) 14 else 15 flash[:danger] = "コメントできません" 16 redirect_back(fallback_location: image_url(post.id)) 17 end 18 end 19 20 def destroy 21 post = Post.find(params[:post_id]) 22 @comment = post.comments.find(params[:id]) 23 @comment.destroy 24 redirect_back(fallback_location: image_path(post) 25 end 26end
DrqYuto👍を押しています

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

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

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

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

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

guest

回答1

0

@post.comments.build が動くにはいくつか条件があります
0. model Comment と model Postが関係つけられていること
具体的には
class Comment に belongs_to :post があること
class Post に had_many :commentsがあること
0. そのために必要なcolumnが定義されていること
具体的には model Comment に post_id があること

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

投稿2020/01/01 02:41

winterboum

総合スコア23567

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

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

退会済みユーザー

退会済みユーザー

2020/01/01 03:07

ご回答ありがとうございます。いろいろ条件があるのですね。 1. すみません。記載してませんでしたが、 class Comment belongs_to :post class Post had_many :comments は作ってました。 2. Comments Modelを $ rails g model Comments content:string Posts:references で作成したのですが、referencesでpost(投稿)と関連付けるつもりだったのですが、無理だったでしょうか。 Postsテーブルにpost_idがあるので、その情報を引っ張ってきたいです。
winterboum

2020/01/01 03:12 編集

db/schema.rbをみると どうなっているかわかりますから、確認してみてください。 わからない時は、schema.rb と migration fileを質問に追加してください
退会済みユーザー

退会済みユーザー

2020/01/01 03:35 編集

返答ありがとうございます。 schema.rbを見てみました。 作成したつもりはありませんでしたが、t.index ["posts_id"]が作成されていました。 これだとposts_idがあるので、2番はクリアされていることになりますね。。。
winterboum

2020/01/01 03:45

t.index ["posts_id"] という記述が気になります。 全体見せられます?
退会済みユーザー

退会済みユーザー

2020/01/01 04:13

全体というのはschema.rbのことでしょうか? 質問に追記してあります。 それとも他のファイルのことでしょうか?
winterboum

2020/01/01 04:31

あ、みおとしてました。 post_id でなければならない所 posts_id になってます
退会済みユーザー

退会済みユーザー

2020/01/01 13:56

なるほど! ご回答ありがとうございました!
退会済みユーザー

退会済みユーザー

2020/01/01 14: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.」です。
winterboum

2020/01/01 21:54

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問