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

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

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

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

Q&A

解決済

1回答

4218閲覧

dbに値が保存されない

MayuKuno

総合スコア3

Ruby on Rails

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

0グッド

0クリップ

投稿2020/08/11 13:13

前提・実現したいこと

ウィザード方式の新規会員登録でユーザー情報をdbに登録したいです。

現在、個人開発アプリを作成しております。
deviceを使ってウィザード方式フォームでユーザー登録を実現しようとしております。
1ページ目:プロフィール画像や名前など
2ページ目:住所(住所自動入力含む
3ページ目:完了ページ

他のモデルを作成する前までは、問題なく登録できていたのですが、
他のモデルの作成・アソシエーション実装後、dbに保存がされなくなってしまいました。
(他にもcarrierwaveのインストールなどもしているので、どこを境にできなくなったのかが明確ではありません。)

発生している問題・エラーメッセージ

エラー文は特に出ていなかったので、saveからsave!に変更したところ、以下のようなエラー文が表示されました。
イメージ説明
また、コンソールは以下のようにROLLBACKとなってしまっています。

イメージ説明

該当のソースコード

【registrations_Controller.rb】
ウィザード方式のフォームに対応するdeviceのコントローラです。

ruby:registrations_Controller.rb

1# frozen_string_literal: true 2 3class Users::RegistrationsController < Devise::RegistrationsController 4 # before_action :configure_sign_up_params, only: [:create] 5 # before_action :configure_account_update_params, only: [:update] 6 7 8 def new 9 @user = User.new 10 end 11 12 def create 13 @user = User.new(sign_up_params) 14 unless @user.valid? 15 flash.now[:alert] = @user.errors.full_messages 16 render :new and return 17 end 18 session["devise.regist_data"] = {user: @user.attributes} 19 session["devise.regist_data"][:user]["password"] = params[:user][:password] 20 @address = @user.build_address 21 render :new_address 22 end 23 24 def create_address 25 @user = User.new(session["devise.regist_data"]["user"]) 26 @address = Address.new(address_params) 27 28 unless @address.valid? 29 flash.now[:alert] = @address.errors.full_messages 30 render :new_address and return 31 end 32 @user.build_address(@address.attributes) 33 @user.save! 34 session["devise.regist_data"]["user"].clear 35 sign_in(:user, @user) 36 end 37 # GET /resource/edit 38 # def edit 39 # super 40 # end 41 42 # PUT /resource 43 # def update 44 # super 45 # end 46 47 # DELETE /resource 48 # def destroy 49 # super 50 # end 51 52 # GET /resource/cancel 53 # Forces the session data which is usually expired after sign 54 # in to be expired now. This is useful if the user wants to 55 # cancel oauth signing in/up in the middle of the process, 56 # removing all OAuth session data. 57 # def cancel 58 # super 59 # end 60 61 # protected 62 63 # If you have extra params to permit, append them to the sanitizer. 64 # def configure_sign_up_params 65 # devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute]) 66 # end 67 68 # If you have extra params to permit, append them to the sanitizer. 69 # def configure_account_update_params 70 # devise_parameter_sanitizer.permit(:account_update, keys: [:attribute]) 71 # end 72 73 # The path used after sign up. 74 # def after_sign_up_path_for(resource) 75 # super(resource) 76 # end 77 78 # The path used after sign up for inactive accounts. 79 # def after_inactive_sign_up_path_for(resource) 80 # super(resource) 81 # end 82 protected 83 84 def address_params 85 params.require(:address).permit(:zipcode, :prefecture_code, :city,:district, :building, :room) 86 end 87end

【Application_controller.rb】

ruby:Application_controller.rb

1class ApplicationController < ActionController::Base 2 protect_from_forgery with: :exception 3 before_action :configure_permitted_parameters, if: :devise_controller? 4 def after_sign_in_path_for(resource) 5 posts_path 6 end 7 def after_sign_out_path_for(resource) 8 root_path 9 end 10 protected 11 12 def configure_permitted_parameters 13 devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname,:first_name,:last_name, :first_name_kana, :last_name_kana,:birthday,:image]) 14 end 15end

【user.rb】

class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable validates :nickname,:first_name,:last_name, :first_name_kana, :last_name_kana,:birthday,:image ,presence: true has_one :address has_many :posts has_many :messages has_many :group_users, dependent: :destroy has_many :groups, through: :group_users, dependent: :destroy include JpPrefecture jp_prefecture :prefecture_code mount_uploader :image, ImageUploader def prefecture_name JpPrefecture::Prefecture.find(code: prefecture_code).try(:name) end def prefecture_name=(prefecture_name) self.prefecture_code = JpPrefecture::Prefecture.find(name: prefecture_name).code end end

【address.rb】

class Address < ApplicationRecord belongs_to :user, optional: true validates :zipcode, :prefecture_code, :city,:district,presence: true mount_uploader :image, ImageUploader end

試したこと

####■モデル
######アソシエーションが正しくできていない?

userモデルに関連してくる他のモデルはaddress,post,group,messageです。
それぞれにhas_many(one)とbelong toの関係がしっかり記述されているか確認した

######外部キーのnilを許可できていない?
belong_toの記述の後に, optional: trueを追記した

######画像が正しく2ページ目(住所登録)に引き継がれていない?
正しいかわからないですが、mount_uploader :image, ImageUploaderをaddress.rbにも追記

####■コントローラ
######「Validation failed: Image can't be blank」のためimageが保存できていない?
application_controllerのdevise_parameter_sanitizerにimageが記載されているか確認

######「Validation failed: Image can't be blank」のためimageが保存できていない?

######@address = Address.new(address_params)の下に@address.user = current_userを追記
他で質問されていたもので、回答になっていたので、こちらも試してみました。

初めて、teratail利用させていただきます。
質問の仕方がわかりにくいなどございましたら、ご教示いただけますと幸いです。
何卒宜しくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

もしかしたらですが、createメソッドでsessionに格納しているときはシンボルをキーにしていますが、
create_addressメソッドでは文字列でアクセスしているため、@user.attributesの値を取得できていないのではないでしょうか?

シンボルか文字列どちらかに統一すればエラーが解消できないでしょうか?

ruby

1# createメソッドではsessionに格納するHashのキーがシンボルで格納されている 2session["devise.regist_data"] = {user: @user.attributes}

ruby

1# create_addressメソッドでは文字列でアクセスしている 2@user = User.new(session["devise.regist_data"]["user"])

投稿2020/08/11 16:49

TomoProg

総合スコア19

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

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

MayuKuno

2020/08/14 11:38

ご返答いただきましてありがとうございます!こちら確かにバラバラで気持ち悪いですね、修正いたしましたが、こちらでは解決しないようでした。。
TomoProg

2020/08/14 12:34

そうでしたか、試していただきありがとうございます。 この質問からはこれ以上、力になれそうもなく申し訳ないです。 コードがすべてgithubなどに上がっており、共有できる状態なのであれば、こちらで実際に動かしてエラーについて調査することも可能かと思います。 もし、まだエラーの調査に難航しているようであれば教えていただければと思います。
MayuKuno

2020/08/24 11:41

ありがとうございます。carrierwave でアップロードされて、まだ save されていない画像が session 経由でちゃんと引き継がれていないことが原因のようです。一旦、画像はこちらのウィザード方式ないで登録しないとことにいたしました。。ありがとうございます!ご返信に気づかず、、返答が遅くなりました、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問