#現状
プログラミング初学者で現在Rialsで要約アプリを作成中です。
form_withで入力フォームを作成し登録ボタンを押すもデータベースにデータが登録できない現状です。
1日検索して試行錯誤しましが自力で解決できず質問させて頂きます。
お手数おかけしますがご指摘宜しくお願いいたします。
##エラーメッセージなど
・ビューにはエラ〜メッセージは表示されておりません。 コントローラーでflaseの時はnewへrenderするようにしているのでfalse時の条件分岐が作用している状態です。 ・ターミナルには下記出力がされています。 User Load (1.1ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1 ↳ app/controllers/posts_controller.rb:37 (0.2ms) BEGIN ↳ app/controllers/posts_controller.rb:15 User Load (0.6ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 ↳ app/controllers/posts_controller.rb:15 (0.2ms) ROLLBACK ↳ app/controllers/posts_controller.rb:15 Rendering posts/new.html.haml within layouts/application Rendered posts/_header.html.haml (3.9ms) Rendered posts/_footer.html.haml (2.7ms) Rendered posts/new.html.haml within layouts/application (22.7ms) Completed 200 OK in 101ms (Views: 84.4ms | ActiveRecord: 2.2ms)
##やったこと
①binding.pryで取得データの確認
②ROLLBACKの箇所にuser_idの記載があったのでアソシエーションの確認
###検証
①Post.new(post_params)やpost_paramsにデータが入っていることを確認。 Post.new(post_params) User Load (14.0ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1 ↳ app/controllers/posts_controller.rb:37 => #<Post:0x00007fed558b90f8 id: nil, title: "入力内容", pharse: "入力内容", summery: "入力内容", created_at: nil, updated_at: nil, user_id: 1, image: nil, category_id: nil> ・@post.save!を行うも「NoMethodError: undefined method `save!' for nil:NilClass」``` ②userとpostのアソシエーションは組めていることを確認 (post.rb) class Post < ApplicationRecord belongs_to :user (user.rb) class User < ApplicationRecord has_many :posts
###仮説
指摘箇所を踏まえるとuser_idが原因ではないかと思います。
しかし、解決までの糸口を見いだせていない現状です。
###コード (posts.controller.rb) class PostsController < ApplicationController def index @posts = Post.all.limit(3).order("created_at DESC") end def new @post = Post.new end def create @post = Post.new(post_params) if @post.save redirect_to root_path else render :new end end # def show # end # def destroy # end # def edit # end # def update # end def post_params params.require(:post).permit( :title, :pharse, :summery, :image).merge(user_id: current_user.id) end end (appplication.controller.rb) class ApplicationController < ActionController::Base before_action :configure_permitted_parameters, if: :devise_controller? protect_from_forgery with: :exception protected def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname, :prefecture_id, :city, :birth_year, :birth_month, :birth_day, :age_id, :gender_id]) end end (registrations_controller.rb) class Users::RegistrationsController < Devise::RegistrationsController before_action :configure_sign_up_params, only: [:create] # before_action :configure_account_update_params, only: [:update] def new @user = User.new end def create @user = User.new(sign_up_params) unless @user.valid? flash.now[:alert] = @user.errors.full_messages render :new and return end session["devise.regist_data"] = {user: @user.attributes} session["devise.regist_data"][:user]["password"] = params[:user][:password] @information = @user.build_user_information render :new_user_information end def create_user_information @user = User.new(session["devise.regist_data"]["user"]) @information = UserInformation.new(user_information_params) unless @information.valid? flash.now[:alert] = @information.errors.full_messages render :new_user_information and return end @user.build_user_information(@information.attributes) if @user.save! sign_in(:user, @user) else new_user_registration_path end end protected def configure_sign_up_params devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute]) end protected def user_information_params params.require(:user_information).permit(:prefecture_id, :city, :birth_year, :birth_month, :birth_day, :age_id, :gender_id) end def after_sign_up_path_for(resource) root_path end end
本筋とは関係ないですがマークダウンで書いた方が色んな人が見やすくていいと思います。
コード(controllerとかの)書き加えてもらっていいですか?
chocolate24様
ご指摘ありがとうございます。
マークダウンのご指摘ありがとうございます。
こちらも学んで活かしていきます。
取り急ぎcontrollerのコードを追記いたしました。
至らない点があると思いますが宜しくお願いいたします。
User Load (1.1ms) SELECT users.* FROM users WHERE users.id = 1 ORDER BY users.id ASC LIMIT 1となっていますが、カラムはuser_idなのが気になります。
chocolate24様
ありがとうございます。
ご指摘を受けたカラムめいについてですが、
userとpostのアソシエーションでpostsテーブルには
user_idで外部キーを使用しております。
ただ、ターミナル上ではuser.idとなっているので、
ご指摘の通り齟齬が出ている現状です。
そこに関して原因を調べておりますが解消までは至っていない現状です。
わかりました!もう1度みてみます。
改変
回答1件
あなたの回答
tips
プレビュー