前提・実現したいこと
ウィザード方式の新規会員登録でユーザー情報を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利用させていただきます。
質問の仕方がわかりにくいなどございましたら、ご教示いただけますと幸いです。
何卒宜しくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/14 11:38
2020/08/14 12:34
2020/08/24 11:41