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

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

ただいまの
回答率

88.92%

ウィザード形式での個人情報登録でデータが保存されない

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 336

raurauji

score 13

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

某プログラミングスクールでフリマアプリを作っています。現在Deviseを使いつつ、ウィザード形式での個人情報登録(氏名や住所など)を実装しています。しかし、フォーム入力後にデータベースに情報が保存されないという状況です。。

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

特にエラー文はありません。

該当のソースコード

/app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  before_action :basic_auth, if: :production?
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname])
    devise_parameter_sanitizer.permit(:sign_up, keys: [:last_name])
    devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name])
    devise_parameter_sanitizer.permit(:sign_up, keys: [:last_name_kana])
    devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name_kana])
    devise_parameter_sanitizer.permit(:sign_up, keys: [:birth_year])
    devise_parameter_sanitizer.permit(:sign_up, keys: [:birth_month])
    devise_parameter_sanitizer.permit(:sign_up, keys: [:birth_date])
    devise_parameter_sanitizer.permit(:sign_up, keys: [:phone_number])
  end
  protect_from_forgery with: :exception

  private

  def production?
    Rails.env.production?
  end

  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


/app/controllers/users/registrations_controller.rb

# frozen_string_literal: true

class Users::RegistrationsController < Devise::RegistrationsController
  # 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

  # POST /resource
  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]
    @address = @user.address.build
    render :new_address
  end

  def create_address
    @user = User.new(session["devise.regist_data"]["user"])
    @address = Address.new(address_params)
    unless @address.valid?
      flash.now[:alert] = @address.errors.full_messages
      render :new_address and return
    end
    @user.address.build(@address.attributes)
    @user.save
    sign_in(:user, @user)
  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


  protected

  def configure_sign_up_params
    devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute])
  end

  def address_params
    params.require(:address).permit(:post_code, :prefecture, :city, :block, :building, :last_name, :first_name, :last_name_kana, :first_name_kana, :phone_number)
  end
end


app/views/devise/registrations/new.html.haml

.user-registration
  %h2 ユーザー情報登録
  = form_for(@user, url: user_registration_path) do |f|
    = render "devise/shared/error_messages", resource: @user
    .field
      = f.label :ニックネーム
      %br/
      = f.text_field :nickname, autofocus: true, maxlength: "10"
    .field
      = f.label :      %br/
      = f.text_field :last_name, autofocus: true, maxlength: "5"
    .field
      = f.label :      %br/
      = f.text_field :first_name, autofocus: true, maxlength: "5"
    .field
      = f.label :カナ姓
      %br/
      = f.text_field :last_name_kana, autofocus: true, maxlength: "20"
    .field
      = f.label :カナ名
      %br/
      = f.text_field :first_name_kana, autofocus: true, maxlength: "20"
    .field
      = f.label :生年月日
      %br/
      = f.text_field :birth_year, autofocus: true, maxlength: "4"
      = f.text_field :birth_month, autofocus: true, maxlength: "2"
      = f.text_field :birth_date, autofocus: true, maxlength: "2"
    .field
      = f.label :電話番号
      %br/
      = f.text_field :phone_number, autofocus: true, maxlength: "12"
    .field
      = f.label :Eメール
      %br/
      = f.email_field :email, autofocus: true, autocomplete: "email"
    .field
      = f.label :パスワード
      %br/
      = f.password_field :password, autocomplete: "new-password", minimumlength: "7"
    .field
      = f.label :パスワード再入力
      %br/
      = f.password_field :password_confirmation, autocomplete: "new-password", minimumlength: "7"

    .actions
      = f.submit "Next"
  = render "devise/shared/links"


app/views/devise/registrations/new_address.html.haml

%h2 住所情報登録
= form_for @address do |f|
  = render "devise/shared/error_messages", resource: @address
  .field
    = f.label :郵便番号
    %br/
    = f.text_field :post_code, autofocus: true, maxlength: "7"
  .field
    = f.label :都道府県
    %br/
    = f.text_field :prefecture, autofocus: true
  .field
    = f.label :市区町村
    %br/
    = f.text_field :city, autofocus: true
  .field
    = f.label :番地
    %br/
    = f.text_field :block, autofocus: true
  .field
    = f.label :マンション名
    %br/
    = f.text_field :building, autofocus: true
  %h1 送付先氏名
  .field
    = f.label :    %br/
    = f.text_field :last_name, autofocus: true
  .field
    = f.label :    %br/
    = f.text_field :first_name, autofocus: true
  .field
    = f.label :カナ姓
    %br/
    = f.text_field :last_name_kana, autofocus: true
  .field
    = f.label :カナ名
    %br/
    = f.text_field :first_name_kana, autofocus: true
  .field
    = f.label :電話番号
    %br/
    = f.text_field :phone_number, autofocus: true             
  .actions
    = f.submit "Sign up"
= render "devise/shared/links"


db/schema.rb

ActiveRecord::Schema.define(version: 2020_02_01_064100) do

  create_table "addresses", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
    t.integer "post_code", null: false
    t.string "prefecture", null: false
    t.string "city", null: false
    t.string "block", null: false
    t.string "building", null: false
    t.string "last_name", null: false
    t.string "first_name", null: false
    t.string "last_name_kana", null: false
    t.string "first_name_kana", null: false
    t.string "phone_number", null: false
    t.bigint "user_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["user_id"], name: "index_addresses_on_user_id"
  end

  create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "nickname", default: "", null: false
    t.string "last_name", default: "", null: false
    t.string "first_name", default: "", null: false
    t.integer "birth_year", null: false
    t.integer "birth_month", null: false
    t.integer "birth_date", null: false
    t.string "phone_number", default: "", null: false
    t.string "last_name_kana"
    t.string "first_name_kana", null: false
    t.index ["email"], name: "index_users_on_email", unique: true
    t.index ["nickname"], name: "index_users_on_nickname"
    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
  end
end
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る