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

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

ただいまの
回答率

89.06%

date_selectタグを使ってユーザーの誕生日を保存したい

受付中

回答 0

投稿

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

gaffai

score 1

前提・実現したいこと

'devise'を使ってユーザーの新規登録機能を実装しています。
誕生日の入力をdate_selectタグを使って記述し、createアクションを実行したところ以下のようなエラーが表示されます。
エラーを解決し、誕生日の情報をuserテーブルに保存できるようにしたい。
paramsの中身を日付型にする記述をコントローラーないでしていますがうまくいきません。

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

リンク内容

NoMethodError in SignupController#create
undefined method `[]' for nil:NilClass
#signup_controller.rb

 def birthday_join
      date = params[:user][:birthday]  
      Date.new date["birthday(1i)"].to_i,date["birthday(2i)"].to_i,date["birthday(3i)"].to_i
    end
end

該当のソースコード

#signup_controller

class SignupController < ApplicationController
  def index
  end

  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[:last_name] = user_params[:last_name]
    session[:first_name] = user_params[:first_name]
    session[:last_name_kana] = user_params[:last_name_kana]
    session[:first_name_kana] = user_params[:first_name_kana]
    session[:birthday] = user_params[:birthday]
    @user = User.new
  end

  def create
    params[:user][:birthday] = birthday_join
    @user = User.new(
      nickname: session[:nickname],
      email: session[:email],
      password: session[:password],
      password_confirmation: session[:password_confirmation],
      last_name: session[:last_name],
      first_name: session[:first_name],
      last_name_kana: session[:last_name_kana],
      first_name_kana: session[:first_name_kana],
      birthday: session[:birthday],
      phone_number: session[:phone_number],
      address_last_name: session[:address_last_name],
      address_first_name: session[:address_first_name],
      address_last_name_kana: session[:address_last_name_kana],
      address_first_name_kana: session[:address_first_name_kana],
      address_number: session[:address_number],
      address_prefecture: session[:address_prefecture],
      address_name: session[:address_name],
      address_block: session[:address_block],
      address_building: session[:address_building],
      address_phone_number: session[:address_phone_number]
    )
    if @user.save
      session[:id] = @user.id
      redirect_to done_signup_index_path
    else
      render signup_index_path
    end
  end

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

  private
    def user_params
      params.require(:user).permit(
        :nickname,
        :email,
        :password,
        :password_confirmation,
        :last_name,
        :first_name,
        :last_name_kana,
        :first_name_kana,
        :birthday,
        :phone_number,
        :address_last_name,
        :address_first_name,
        :address_last_name_kana,
        :address_first_name_kana,
        :address_number,
        :address_prefecture,
        :address_name,
        :address_block,
        :address_building,
        :address_phone_number
      )
    end

    def birthday_join #paramsの中身を日付型にする記述
      date = params[:user][:birthday]  
      Date.new date["birthday(1i)"].to_i,date["birthday(2i)"].to_i,date["birthday(3i)"].to_i
    end
end
#db/migrate/devise_create_users.rb

class DeviseCreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :nickname,           null: false
      t.string :email,              null: false, unique: true
      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.date :birthday,             null: false
      t.integer :phone_number,      null: false, unique: true
      t.string :address_last_name,  null: false
      t.string :address_first_name, null: false
      t.string :address_last_name_kana,  null: false
      t.string :address_first_name_kana, null: false
      t.string :address_number,      null: false
      t.integer :address_prefecture, null: false, default: 0
      t.string :address_name,        null: false
      t.string :address_block,       null: false
      t.string :address_building
      t.integer :address_phone_number
      t.string :encrypted_password,  null: false, default: ""

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

      ## Rememberable
      t.datetime :remember_created_at
      t.timestamps null: false
    end

    add_index :users, :email,                unique: true
    add_index :users, :reset_password_token, unique: true
  end
end
#step2.html.haml

%body
  %noscript
    = image_tag 'logo.svg', alt: 'ee'
  .single-container
    %header.single-header
      %h1.header
        = link_to "#", class:'link' do
          = image_tag 'logo.svg', alt: 'mercari', class: 'mercari'
        %nav.progress-bar.singup-bar
    %main.single-main
      %section.l-single-container
        %h2.l-single-head.registration 住所入力
        = form_for @user, url: '/signup' , method: :post, html: {class: 'l-single-inner'} do |f|
          %input(type="hidden")
          .l-single-content
            .form-group.nickname
              = f.label :phone_number, "電話番号"
              %span.form-require 必須
              = f.number_field :phone_number, placeholder:"例)080-1234-5678", class:"input-default"
            .form-group.email
              = f.label :address_number, "郵便番号"
              %span.form-require 必須
              = f.number_field :address_number, placeholder:"123-4567", class:"input-default"
              %input(type="hidden")
            .form-group.form-password-revelation
              = f.label :address_prefecture, "都道府県"
              %span.form-require 必須
              = f.text_field :address_prefecture, placeholder:"東京都", class:"input-default"
              %p.form-info-text
              = f.label :address_name, "住所"
              %span.form-require 必須
              = f.text_field :address_name, placeholder:"港区六本木", class:"input-default"
              %p.form-info-text
              = f.label :address_block, "番地"
              %span.form-require 必須
              = f.text_field :address_block, placeholder:"1-123-4", class:"input-default"
              .form-password-revelation-taggle
                .form-password-revelation-revealed-password-container
                  %span.form-password-revelation-revealed-password
            .form-group.confirmation
              %h3.text-left 本人確認
              %p.l-single-text
                安心・安全にご利用いただくために、お客様の本人情報の登録にご協力ください。他のお客様に公開されることはありません。
            .form-group.name-kanji
              %div
                = f.label "送付先お名前",class:"kanji"
                %span.form-require 必須
              = f.text_field :address_last_name, placeholder:"例) 山田", class:"input-default half1"
              = f.text_field :address_first_name, placeholder:"例) 彩", class:"input-default half2"
            .form-group.name-kana
              %div
                = f.label "送付先お名前カナ(全角)",class:"kana"
                %span.form-require 必須
              = f.text_field :address_last_name_kana, placeholder:"例) ヤマダ", class:"input-default half3"
              = f.text_field :address_first_name_kana, placeholder:"例) アヤ",class:"input-default half4"
              %input(type="hidden")
              .clearfit
              %p.form-info-text
                ※ 本人情報は正しく入力してください。会員登録後、修正するにはお時間をいただく場合があります。
          .l-single-content2
            %input(type="hidden")
            = f.submit "登録する",class:"submit"


ターミナルの結果は以下のようになります。
リンク内容
"birthday"=>{"birthday(1i)"=>"2019", "birthday(2i)"=>"3", "birthday(3i)"=>"13"}
のように情報が渡っています。

試したこと

・devise_parameter_sanitizerメソッドをapplication.controllerに記述
・require 'date'の記述

補足情報(FW/ツールのバージョンなど)

ruby '2.6.5'
rails '6.0.0'
mysql2 '0.4.4'

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

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

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

関連した質問

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