前提・実現したいこと
現在、Ruby on Railsで開発しており、ウィザード形式のユーザー登録フォーム実装をしております。
1ページ目で入力させたdeviseのpasswordの値がsessionには入るのですが、変数に代入する事ができません。
お手数ですが、ご助言いただけますと幸いでございます。
1ページ目のキャプチャ
2ページ目のキャプチャ
発生している問題・エラーメッセージ
現状、登録フォームを入力していくと、最後のアクションで
Password can't be blank のエラーが表示されます。
エラー画面キャプチャ
該当のソースコード
- registrations_controller.rb
# frozen_string_literal: true class Users::RegistrationsController < Devise::RegistrationsController before_action :configure_sign_up_params, only: [:performance] # before_action :configure_sign_up_params, only: [:create] # before_action :configure_account_update_params, only: [:update] # GET /resource/sign_up def new @user = User.new end def performance @user = User.new(sign_up_params) session["devise.regist_data"] = {user: @user.attributes} session["devise.regist_data"][:user]["password"] = params[:user][:password] # @user = User.new(session["devise.regist_data"]["user"]) # unless @user.valid? # flash.now[:alert] = @user.errors.full_messages # render :new and return # end end def done @user = User.new(session["devise.regist_data"]["user"]) # binding.pry session["devise.regist_data"] = {user: @user.attributes} session["devise.regist_data"][:user]["prefecture"] = params[:user][:prefecture] session["devise.regist_data"][:user]["introduction"] = params[:user][:introduction] session["devise.regist_data"][:user]["performance"] = params[:user][:performance] session["devise.regist_data"][:user]["portfolio"] = params[:user][:portfolio] @user = User.new(session["devise.regist_data"][:user]) @user.save! sign_in(:user, @user) 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 :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :name_kana, :tel, :birthday, :status, :prefecture, :introduction, :performance, :portfolio]) end end
- 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 :name, :name_kana, :tel, :birthday, :status ,presence: true validates :tel, uniqueness: true enum status: { 公開:1,非公開:2 }, _prefix: true enum prefecture: { 北海道:1,青森県:2,岩手県:3,宮城県:4,秋田県:5,山形県:6,福島県:7, 茨城県:8,栃木県:9,群馬県:10,埼玉県:11,千葉県:12,東京都:13,神奈川県:14, 新潟県:15,富山県:16,石川県:17,福井県:18,山梨県:19,長野県:20, 岐阜県:21,静岡県:22,愛知県:23,三重県:24, 滋賀県:25,京都府:26,大阪府:27,兵庫県:28,奈良県:29,和歌山県:30, 鳥取県:31,島根県:32,岡山県:33,広島県:34,山口県:35, 徳島県:36,香川県:37,愛媛県:38,高知県:39, 福岡県:40,佐賀県:41,長崎県:42,熊本県:43,大分県:44,宮崎県:45,鹿児島県:46,沖縄県:47, その他:99 }, _prefix: true end
- new.html.haml
%h2 会員情報入力フォーム = form_for(@user, url: performance_path) do |f| = render "devise/shared/error_messages", resource: @user .name .name__title お名前(全角) .name__required 必須 = f.text_field :name, autofocus: true, autocomplete: "name", placeholder: "例)山田太郎" ,class: 'name-form' .name_kana .name_kana__title お名前カナ(全角) .name_kana__required 必須 = f.text_field :name_kana, autofocus: true, autocomplete: "name_kana", placeholder: "例)ヤマダタロウ" ,class: 'name_kana-form' .email .email__title メールアドレス .email__required 必須 = f.email_field :email, autocomplete: "email", placeholder: "PC・携帯どちらでも可" .password .password__title パスワード(半角英数字) .password__required 必須 = f.password_field :password, autocomplete: "new-password", placeholder: "6文字以上の半角英数字" .tel .tel__title 携帯電話の番号 .tel__required 必須 = f.text_field :tel, autofocus: true, autocomplete: "tel", placeholder: "携帯電話の番号を入力" .birthday .birthday__title 生年月日 .birthday__required 必須 .birthday__select-form != sprintf(f.date_select(:birthday, prefix:'user', with_css_classes:'XXXXX', prompt:"--", use_month_numbers:true, start_year:Time.now.year, end_year:1900, date_separator:'%s'),'年','月')+'日' .status .status__title 会員情報の公開設定 .status__required 必須 .status__select-form = f.select :status, User.statuses.keys, {promt: "---"} .actions = f.submit "次へ" -# = render "users/shared/links"
- performance.html.haml
%h2 活動実績入力フォーム ※お仕事をご希望の方やクリエイターの方は、以下の項目(任意)をご入力ください。 %br ※会員登録のみ、または、お仕事のご依頼のみをご希望の方は何も入力せず、「会員登録する」のボタンをクリックしてください。 = form_for(@user, url: done_path) do |f| = render "devise/shared/error_messages", resource: @user .prefecture .prefecture__title 都道府県 .prefecture__select-form = f.select :prefecture, User.prefectures.keys, {promt: "---"} .introduction .introduction__title 自己紹介 = f.text_field :introduction, autofocus: true, autocomplete: "introduction", placeholder: "200文字程度で自己紹介文をご入力ください" ,class: 'introduction-form' .performance .performance__title 活動実績 = f.text_field :performance, autofocus: true, autocomplete: "performance", placeholder: "これまでの活動実績をご入力ください" ,class: 'performance-form' .portfolio .portfolio__title ポートフォリオなどの参考URL = f.url_field :portfolio, autofocus: true, autocomplete: "portfolio", placeholder: "" ,class: 'portfolio-form' .actions = f.submit "会員登録する" -# = render "users/shared/links"
試したこと
ユーザー登録、最後のアクションであるdoneアクションの最初の代入記述にbinding.pryをかけ、以下の値をターミナルで確認しました。
① @user ⇨ passwordが入っていない。
② session["devise.regist_data"]["user"] ⇨ passwordが入っている。
③ User.new(session["devise.regist_data"]["user"]) ⇨ passwordが入っていない。
- ターミナルキャプチャ
- pry記述箇所
def done @user = User.new(session["devise.regist_data"]["user"]) binding.pry session["devise.regist_data"] = {user: @user.attributes} session["devise.regist_data"][:user]["prefecture"] = params[:user][:prefecture] session["devise.regist_data"][:user]["introduction"] = params[:user][:introduction] session["devise.regist_data"][:user]["performance"] = params[:user][:performance] session["devise.regist_data"][:user]["portfolio"] = params[:user][:portfolio] @user = User.new(session["devise.regist_data"][:user]) @user.save! sign_in(:user, @user) end
仮説
doneアクションの前のperformanceアクションで
session["devise.regist_data"] = {user: @user.attributes}
を記述し、ハッシュを整形(?)した際にpasswordの値が session["devise.regist_data"] に入らないため、不具合が起きているのでしょうか?
※ただ、passwordを再代入する事でハッシュの中にpasswordが入るよう意図しております。
※下記記述は以前に別のアプリ開発で、ウィザード形式の実装を行った時のものですが、今回も同じ記述をそのまま書いております。
session["devise.regist_data"] = {user: @user.attributes} session["devise.regist_data"][:user]["password"] = params[:user][:password]
開発環境
ruby 2.5.1
Rails 5.2.4.1
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。