前提・実現したいこと
ここに質問の内容を詳しく書いてください。
ruby on railsでWebアプリケーションを作成しております。
現在、ユーザー新規登録機能を実装中です。
ユーザー新規登録をウィザード形式を採用しました。
binding.pryでみて見るとしっかりと値は取れてきているのですが、
なぜだかDBに保存されないです。
発生している問題・エラーメッセージ
パスワードやemailを保存するadmi_usersテーブルと
プロフィールや住所を保存するadmin_profileテーブルを
1対1の関係でアソシエーションを組みました。
該当のソースコード
controllers/admin_users/registrations_controller.rb
# frozen_string_literal: true class AdminUsers::RegistrationsController < Devise::RegistrationsController # before_action :configure_sign_up_params, only: [:create] # before_action :configure_account_update_params, only: [:update] def new @admin_user = AdminUser.new end def create @admin_user = AdminUser.new(sign_up_params) unless @admin_user.valid? render :new and return end session["devise.regist_data"] = {admin_user: @admin_user.attributes} session["devise.regist_data"][:admin_user]["password"] = params[:admin_user][:password] @admin_profile = @admin_user.build_admin_profile render :new_admin_profile end def create_admin_profile @admin_user = AdminUser.new(session["devise.regist_data"]["admin_user"]) @admin_profile = AdminProfile.new(admin_profile_params) unless @admin_profile.valid? render :new_admin_profile and return end @admin_user.build_admin_profile(@admin_profile.attributes) @admin_user.save session["devise.regist_data"]["admin_user"].clear sign_in(:admin_user, @admin_user) end private def admin_profile_params params.require(:admin_profile).permit(:admin_image, :postal_code, :prefecture_id, :municipality, :address, :building_name, :phone_number, :profile) end # GET /resource/sign_up # def new # super # end # POST /resource # def create # super # end # GET /resource/edit # def edit # super # end # PUT /resource # def update # super # end # DELETE /resource # def destroy # super # end # GET /resource/cancel # Forces the session data which is usually expired after sign # in to be expired now. This is useful if the user wants to # cancel oauth signing in/up in the middle of the process, # removing all OAuth session data. # def cancel # super # end # protected # If you have extra params to permit, append them to the sanitizer. # def configure_sign_up_params # devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute]) # end # If you have extra params to permit, append them to the sanitizer. # def configure_account_update_params # devise_parameter_sanitizer.permit(:account_update, keys: [:attribute]) # end # The path used after sign up. # def after_sign_up_path_for(resource) # super(resource) # end # The path used after sign up for inactive accounts. # def after_inactive_sign_up_path_for(resource) # super(resource) # end end
application_controller.rb
class ApplicationController < ActionController::Base before_action :basic_auth before_action :configure_permitted_parameters, if: :devise_controller? def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:store_name]) end private def basic_auth authenticate_or_request_with_http_basic do |username, password| username == ENV['BASIC_AUTH_USER'] && password == ENV['BASIC_AUTH_PASSWORD'] end end end
models/admin_user.rb
class AdminUser < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable PASSWORD_REGGEX = /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i.freeze validates_format_of :password, with: PASSWORD_REGGEX validates :store_name, presence: true has_many :events has_one :admin_profile end
models/admin_profile.rb
class AdminProfile < ApplicationRecord belongs_to :admin_user, optional: true has_one_attached :admin_image extend ActiveHash::Associations::ActiveRecordExtensions belongs_to :prefecture with_options presence: true do validates :postal_code, format: { with: /\A[0-9]{3}-[0-9]{4}\z/ } validates :prefecture_id, numericality: { other_than: 1, message: "can't be blank"} validates :municipality validates :address validates :phone_number, format: { with: /\A\d{10,11}\z/ } validates :profile validates :admin_image end end
new_admin_profile.html.erb
<%= render "shared/second_header" %> <div class="signup-wrapper"> <div class="signup-main"> <p class="title"> 店舗詳細登録 </p> <%= form_for @admin_profile do |f| %> <%= render 'shared/error_messages', model: f.object %> <div class="container"> <div class="form-box"> <div class="form-text"> イメージ <span class="red">*</span> </div> <div class="click-upload"> <p> クリックしてファイルをアップロード </p> <%= f.file_field :admin_image, id:"profile-image" %> </div> </div> <div class="form-box"> <label for="form-text"> 郵便番号 <span class="red">*</span> </label> <div class="form-right"> <%= f.text_area :postal_code, class:"form-input-box", id:"postal_code", placeholder:"例)123-4567" %> </div> </div> <div class="form-box"> <label for="form-text"> 都道府県 <span class="red">*</span> </label> <div class="form-right"> <%= f.collection_select(:prefecture_id, Prefecture.all, :id, :name, {}, {class:"select-box", id:"profile-prefecture"}) %> </div> </div> <div class="form-box"> <label for="form-text"> 市区町村 <span class="red">*</span> </label> <div class="form-right"> <%= f.text_area :municipality, class:"form-input-box", id:"municipality", placeholder:"例)横浜市緑区" %> </div> </div> <div class="form-box"> <label for="form-text"> 番地 <span class="red">*</span> </label> <div class="form-right"> <%= f.text_area :address, class:"form-input-box", id:"address", placeholder:"例)青山1-1" %> </div> </div> <div class="form-box"> <label for="form-text"> 建物名 </label> <div class="form-right"> <%= f.text_area :building_name, class:"form-input-box", id:"building-name", placeholder:"例)柳ビル 103" %> </div> </div> <div class="form-box"> <label for="form-text"> 電話番号 <span class="red">*</span> </label> <div class="form-right"> <%= f.text_area :phone_number, class:"form-input-box", id:"phone-number", placeholder: "例)09012345678" %> </div> </div> <div class="form-box"> <label for="form-text"> プロフィール <span class="red">*</span> </label> <div class="form-right"> <%= f.text_area :profile, class:"form-text-box", id:"profile" %> </div> </div> <div class="form-box"> <h2 class='form-bottom-text'> 「会員登録」のボタンを押すことにより、 <span>利用規約</span> <br>に同意したものとみなします </h2> </div> <div class='register-btn'> <%= f.submit "会員登録" ,class:"register-submit-btn" %> </div> </div> <% end %> <%= render "shared/footer" %>
試したこと
emailやpasswordの保存を行うadmin_userはmysqlに保存されましたが、
住所やプロフィールの保存を行うadmin_profileは保存されませんでした。
binding.pryをregistrations_controller.rbの
create_admin_profileメソッド内に記述ししてみました。
admin_profile_paramsとターミナルへ入力すると
情報はパラメーターに格納されていますがmysqlへ保存されません。
22: def create_admin_profile => 23: binding.pry 24: @admin_user = AdminUser.new(session["devise.regist_data"]["admin_user"]) 25: @admin_profile = AdminProfile.new(admin_profile_params) 26: unless @admin_profile.valid? 27: render :new_admin_profile and return 28: end 29: @admin_user.build_admin_profile(@admin_profile.attributes) 30: @admin_user.save 31: session["devise.regist_data"]["admin_user"].clear 32: sign_in(:admin_user, @admin_user) 33: end [1] pry(#<AdminUsers::RegistrationsController>)> admin_profile_params => <ActionController::Parameters {"admin_image"=>#<ActionDispatch::Http::UploadedFile:0x00007fb26e526110 @tempfile=#<Tempfile:/var/folders/41/1l2_538s3535cyd3h3y28jj00000gn/T/RackMultipart20210719-6947-12qrix6.jpg>, @original_filename="d62005-2-467583-0.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"admin_profile[admin_image]\"; filename=\"d62005-2-467583-0.jpg\"\r\nContent-Type: image/jpeg\r\n">, "postal_code"=>"123-4567", "prefecture_id"=>"4", "municipality"=>"テスト", "address"=>"テスト", "building_name"=>"テスト", "phone_number"=>"08012345678", "profile"=>"test"} permitted: true>
情報を保存する際に問題があると思うのですが、
変数の定義やスペルミスのチェックをしてみても
特に不備があるように思えませんでした。
どうすればmysqlに保存することができるようになるのでしょうか?
どなたか問題解決のアドバイスをよろしくお願いします!
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/21 09:58 編集
2021/07/21 17:11 編集
2021/07/22 09:52
2021/07/22 12:09
2021/07/22 12:32
2021/07/22 13:09
2021/07/22 13:17
2021/07/22 14:48
2021/07/24 05:09
2021/07/24 09:08