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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1288閲覧

(NameError)uninitialized constant Post::UserIdの解決方法について

ayachika

総合スコア36

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

1グッド

0クリップ

投稿2018/11/05 00:37

編集2018/11/05 01:36

こんにちは。いつもお世話になっております。

今回表記のエラーについてお知恵をお借りしたいと考えております。

現在、投稿サイト(twitterのような)を作成しており、ユーザーと投稿の紐づけを行っているところです。user_idとpostの紐付けを行おうとしています。

belongs_toやhas_manyの記述は行ったのですが、以下のようなエラーが出てしまいます。

NameError in PostsController#create uninitialized constant Post::UserId Extracted source (around line #20): 18 def create 19 # Post モデルを引数のパラメータで初期化(データの保存は指定ない) 20 post = Post.new( 21 content: params[:content], 22 user_id: @current_user.id 23 )

20のところが赤い行になっています。
投稿ボタンを押すとこのようなエラーがでます。Post::UserIdが定義されていないよというエラーだと思うのですがどこに定義すればいいのか、わかりません。
また、このような形の定義が出てくる理由がわかりません。

事前にネットで調べたりしらのですが、インターネット上での解決方法を試してみてもエラーが解決しなかったため、質問させていただきます。
よろしくお願いします。
以下、参考です。

ユーザーモデル

# == Schema Information # # Table name: users # # id :integer not null, primary key # email :string # name :string # password_digest :string # remember_digest :string # created_at :datetime not null # updated_at :datetime not null # user_id :integer # # Indexes # # index_users_on_email (email) UNIQUE # class User < ApplicationRecord has_many :favorites, through: :favorites, source: :post, dependent: :destroy has_many :posts, through: :favorites, dependent: :destroy ,foreign_key: 'user' before_save { email.downcase! } 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_sensitive: false } has_secure_password validates :password, presence: true, length: { minimum: 6 } # 渡された文字列のハッシュ値を返す def self.digest(string) cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost BCrypt::Password.create(string, cost: cost) end # ランダムなトークンを返す def self.new_token SecureRandom.urlsafe_base64 end # 永続セッションのためにユーザーをデータベースに記憶する def remember self.remember_token = User.new_token update_attribute(:remember_digest, User.digest(remember_token)) end # 渡されたトークンがダイジェストと一致したらtrueを返す def authenticated?(remember_token) return false if remember_digest.nil? BCrypt::Password.new(remember_digest).is_password?(remember_token) end # ユーザーのログイン情報を破棄する def forget update_attribute(:remember_digest, nil) end end

postモデル

# picture :string # title :string # created_at :datetime not null # updated_at :datetime not null # class Post < ApplicationRecord #Commentモデルを複数持てる様にする has_many :posts, dependent: :destroy has_many :comments, dependent: :delete_all has_many :post_tag_relations, dependent: :delete_all # 追加 has_many :tags, through: :post_tag_relations #追加 belongs_to :user_id validates :user_id, presence: true default_scope -> { order(created_at: :desc) } # presence -> 必須チェック # length -> 文字数の制限 # validates :name, presence: true, length: { maximum: 30 } validates :title, presence: true, length: { maximum: 30 } validates :content, presence: true, length: { maximum: 1000 } #画像のアップロード機能を持たせる mount_uploader :picture, PictureUploader validates :user, presence:true #favoriteモデル追加 has_many :favorites, dependent: :destroy has_many :users, through: :favorites validates :user_id,presence: true validates :content, presence: true, length: { maximum: 140 } end

users_controller.rb

class UsersController < ApplicationController def show @user = User.find(params[:id]) @user = User.find(params[:id]) # モデルクラスのwhereメソッドへ検索カラムと値を渡すと合致するモデルを配列形式で返却 #@posts = Post.where(:user_id, @user.id) end def new @user = User.new end def create @user = User.new(user_params) if @user.save log_in @user # 保存の成功をここで扱う。 flash[:success] = "Tsukutta!へようこそ" redirect_to @user else flash[:error_messages] = @user.errors.full_messages render 'new' end end private def user_params params.require(:user).permit(:name, :email, :password, :password_confirmation) end end

posts_controller.rb

# Applicationcontrollerクラスを継承することで、クラスがコントローラと認識される class PostsController < ApplicationController def index # 追加 # タグが選択されている場合は、タグに関連されているデータを取得、そうでなければ全てのデータを取得(ただし、データの全検索はしてない) @posts = params[:tag_id].present? ? Tag.find(params[:tag_id]).posts : Post.all # page メソッドを呼ぶと引数に指定したページに表示するデータ分だけ取得(デフォルトは、25件) @posts = Post.page(params[:page]) end #ルーティングの変更後に追加 def new @post = Post.new(flash[:board]) end def create # Post モデルを引数のパラメータで初期化(データの保存は指定ない) post = Post.new( content: params[:content], user_id: @current_user.id ) # 保存の正否をチェック if post.save # フラッシュ flash[:notice] = "「#{post.title}」の記事が投稿されました!" redirect_to post else redirect_to new_post_path, flash: { post: post, error_messages: post.errors.full_messages } end end # findメソッドで、idにひもづくPOSTオブジェクトを取得する def show @post = Post.find(params[:id]) # @comment = @post.comments.new @comment = Comment.new(post_id: @post.id) end # 追加 def edit @post = Post.find(params[:id]) end def update post = Post.find(params[:id]) # モデルの更新は、クラスメソッドのupdateメソッドで行える post.update(post_params) # フラッシュ flash[:notice] = "「#{@post.title}」の記事を更新しました!" # リダイレクト処理 redirect_to @post end # 削除機能 def destroy @post = Post.destroy(params[:id]) # フラッシュ flash[:notice] = "「#{@post.title}」の記事を削除しました!" # 投稿一覧へリダイレクト redirect_to posts_path end private #paramsから欲しいデータのみ抽出 def post_params #params.require(:post).permit(:name, :title, :content) # tag_ids をリストで追加 #tagがうまくいかない params.require(:post).permit(:user_id,:name, :title, :content, :picture, :tag_ids) end def set_target_post @post = Post.find(params[:id]) end end

ちなみに参考にしているサイトはrailsでユーザーと投稿を紐付けるです。
これをもとに、application_controller_rbはこのようになっています。

class ApplicationController < ActionController::Base protect_from_forgery with: :exception include SessionsHelper before_action :set_current_user def set_current_user @current_user = User.find_by(id: session[:user_id]) end end
yasshun1229👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

postsテーブルがuser_idカラムを持っていません。
代わりにusersテーブルがuser_idカラムを持ってしまっているみたいです。

投稿2018/11/05 01:04

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ayachika

2018/11/05 01:30

ご回答ありがとうございます!usersテーブルからuser_idカラムを削除し、postsテーブルにuser_idカラムを追加したのですが、同様のエラーが消えません…どこかに問題があるのでしょうか?(´;ω;`)もし私が投稿しているコードにエラーの原因があればご教示いただけないでしょうか(>_<)
退会済みユーザー

退会済みユーザー

2018/11/05 01:35

migrateされてますか?
ayachika

2018/11/05 01:37

migrate済です!ほかのファイルにも原因があるのでしょうか。今参考までに私が参考にしているサイトを追記しました。
退会済みユーザー

退会済みユーザー

2018/11/05 01:40

railsも再起動しましたか?
ayachika

2018/11/05 01:55

railsも再起動しています…原因がわからずすみません(´;ω;`)
退会済みユーザー

退会済みユーザー

2018/11/05 02:03 編集

もしかしてここですかね... # models/post.rb belongs_to :user_id ここは belongs_to :user が正しいと思われます。どうでしょうか...
ayachika

2018/11/05 02:10

ありがとうございます!解決できました!少し質問の内容がずれてしまいましたがそれにもお答えいただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問