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

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

ただいまの
回答率

87.50%

mysqlにbirthdayが保存されない

解決済

回答 1

投稿

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

score 5

ActiveRecord::NotNullViolation in SignupController#create
Mysql2::Error: Field 'birthday' doesn't have a default value
というエラーが出ました。

class SignupController < ApplicationController

  def step1
    @user = User.new
  end

  def step2
    session[:nickname] = user_params[:nickname]
    session[:email] = user_params[:email]
    session[:password] = user_params[:password]
    session[:password_confirmation] = user_params[:password_confirmation]
    session[:family_name] = user_params[:family_name]
    session[:first_name] = user_params[:first_name]
    session[:family_name_kana] = user_params[:family_name_kana]
    session[:first_name_kana] = user_params[:first_name_kana]
    session[:birthday] = user_params[:birthday]
    @user = User.new
  end

  def step3
    session[:postal_code] = user_params[:postal_code]
    session[:prefecture] = user_params[:prefecture]
    session[:city] = user_params[:city]
    session[:address] = user_params[:address]
    session[:apartment] = user_params[:apartment]
    @user = User.new
  end

  def create
    @user = User.new(
      nickname: session[:nickname], 
      email: session[:email],
      password: session[:password],
      password_confirmation: session[:password_confirmation],
      family_name: session[:family_name],
      first_name: session[:first_name],
      family_name_kana: session[:family_name_kana],
      first_name_kana: session[:first_name_kana],
      birthday: session[:birthday],
      postal_code: session[:postal_code],
      prefecture: session[:prefecture],
      city: session[:city],
      address: session[:address],
      apartment: session[:apartment],
    )
    if @user.save
      session[:id] = @user.id
      redirect_to done_signup_index_path
    else
      render '/signup/registration'
    end
  end

  def done
    sign_in User.find(session[:id]) unless user_signed_in?
  end

  private

    def user_params
      params.require(:user).permit(:email, :password, :password_confirmation, :nickname, :family_name, :first_name, :family_name_kana, :first_name_kana, :birthday, :postal_code, :prefecture, :city, :address, :apartment)
    end



end
class DeviseCreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""
      t.string :nickname,           null: false
      t.string :user_image
      t.text :introduction
      t.string :first_name,         null: false
      t.string :family_name,        null: false
      t.string :first_name_kana,    null: false
      t.string :family_name_kana,   null: false
      t.date :birthday,             null: false
      t.string :postal_code, null: false
      t.integer :prefecture, null: false
      t.string :city, null: false
      t.string :address, null: false
      t.string :apartment

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      # t.integer  :sign_in_count, default: 0, null: false
      # t.datetime :current_sign_in_at
      # t.datetime :last_sign_in_at
      # t.string   :current_sign_in_ip
      # t.string   :last_sign_in_ip

      ## Confirmable
      # t.string   :confirmation_token
      # t.datetime :confirmed_at
      # t.datetime :confirmation_sent_at
      # t.string   :unconfirmed_email # Only if using reconfirmable

      ## Lockable
      # t.integer  :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
      # t.string   :unlock_token # Only if unlock strategy is :email or :both
      # t.datetime :locked_at


      t.timestamps null: false
    end

    add_index :users, :email,                unique: true
    add_index :users, :reset_password_token, unique: true
    # add_index :users, :confirmation_token,   unique: true
    # add_index :users, :unlock_token,         unique: true
  end
end
= form_for @user, url: step2_signup_index_path, method: :get, html: {class: 'first-main__box'} do |f|
  = f.text_field :nickname, placeholder: '例) ニックネーム'
  = f.email_field :email, placeholder: 'メールアドレス'
  = f.password_field :password, placeholder: '7文字以上'
  = f.password_field :password_confirmation, placeholder: '7文字以上'
  = f.text_field :family_name, placeholder: '例) 田中'
  = f.text_field :first_name, placeholder: '例) 太郎'
  = f.text_field :family_name_kana, placeholder: '例) タナカ'
  = f.text_field :first_name_kana, placeholder: '例) タロウ'
  = f.date_select :birthday, use_month_numbers: true,start_year: 1930, end_year: (Time.now.year - 10), default: Date.new(1989, 1, 1)
  = f.submit "住所の入力へ進む"
= form_for @user, url: signup_index_path, method: :post, html: {class: 'forth-main-wrapper__box'} do |f|
  = f.text_field :postal_code, placeholder: '郵便番号'
  = f.collection_select :prefecture, JpPrefecture::Prefecture.all, :code, :name
  = f.text_field :city, placeholder: '市町村'
  = f.text_field :address, placeholder: '番地'
  = f.text_field :apartment, placeholder: 'ビル名、アパート名'
  = f.submit "登録する"

調べてもpermitを使いましょうというのばかりですでに使っているのでどこを直せばいいかわからない状態です、、
よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

deviceに「birthdayも取り込んでくれ」という指示ができていないです。
こんなの入れてください。

application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    added_attrs = [ :email, :birthday, :password, :password_confirmation ]
    devise_parameter_sanitizer.permit :sign_up, keys: added_attrs
    devise_parameter_sanitizer.permit :account_update, keys: added_attrs
    devise_parameter_sanitizer.permit :sign_in, keys: added_attrs
  end
end

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/26 11:12

    今試してみたのですが、ウィザード形式にせず、
    deviseの新規登録ページ一つで完結するようにすると、
    全て登録はできています。

    キャンセル

  • 2020/07/26 12:16

    一度で全部、でよければそれで行きましょう。
    分けたい場合、
    createに来た時はまだsessionには何も入っていないはずなので、全部空でuserのsaveが行われた、tableの定義でemailとpasswordはdefaultが設定されているから通ったがbirthdayで引っかかっt、ということです。
    createのところはsessionを使わずに params.require(:user).permit( ここに項目名列挙) でnewしましょう

    キャンセル

  • 2020/07/26 22:22

    あれから色々試してみて、rails g devise:controllerをしてaddressテーブルを作ったりなどしていたら、ウィザード形式でうまく登録することができました!
    事細かに教えていただいたこともあり無事搭載できました!
    ありがとうございます!

    キャンセル

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

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

関連した質問

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