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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

1462閲覧

rails5 devise date_select時のハッシュの受け取り方

takumi_erb

総合スコア1

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2020/09/12 16:05

編集2020/09/12 17:21

前提・実現したいこと

Ruby on rails でフリマアプリのユーザー新規登録実装(サーバサイド)でdata_select使用時にハッシュは送れているのですがparametersがネストして入力内容を拾ってくれません gemのdeviseでの実装のためコントローラは生成されてません

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

エラーメッセージ Processing by Users::RegistrationsController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"DXkzfxg+QrpZ7ayralkIq39M4V8giKYUz7CNiIHe6wUDuuv+YGXs1HAykVR1LsaATskbOa7CV7dJapAeNB+h1A==", "user"=>{"nickname"=>"池田 匠", "email"=>"bshuge02@gmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "first_name"=>"池田", "last_name"=>"匠", "first_name_kana"=>"イケダ", "last_name_kana"=>"タクミ"}, "birthday"=>{"birthday(1i)"=>"1997", "birthday(2i)"=>"1", "birthday(3i)"=>"14"}, "commit"=>"新規登録"} (0.2ms) BEGIN

該当のソースコード

Ruby

1.body 2 %header.header 3 = render 'items/header' 4 5 .sessions__container 6 %h2.sessions__container__top 新規会員登録 7 .sessions__container__form 8 = form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| 9 = render "devise/shared/error_messages", resource: resource 10 11 .field.sessions__container__form__box 12 = f.label :nickname,"ニックネーム",class:"sessions__container__form__box-title" 13 %span.sessions__container__form__box-req 必須 14 %br/ 15 = f.text_field :nickname, autofocus: true, prefix:'',class:"container__form__box-inputbox",placeholder:"例)フリマ太郎" 16 17 .field.sessions__container__form__box 18 = f.label :email,"メールアドレス",class:"sessions__container__form__box-title" 19 %span.sessions__container__form__box-req 必須 20 %br/ 21 = f.email_field :email, autofocus: true, prefix:'',class:"sessions__container__form__box-inputbox",placeholder:"PC・携帯どちらでも可" 22 23 .field.sessions__container__form__box 24 = f.label :password,"パスワード",class:"sessions__container__form__box-title" 25 - if @minimum_password_length 26 %em 27 (#{@minimum_password_length} 文字以上) 28 %span.sessions__container__form__box-req 必須 29 %br/ 30 = f.password_field :password, prefix:'',class:"sessions__container__form__box-inputbox",placeholder:"○文字以上の英数字" 31 %p ※ 英字と数字の両方を含めて設定してください 32 33 .field.sessions__container__form__box 34 = f.label :password_confirmation,"パスワード(確認用)",class:"sessions__container__form__box-title" 35 %span.sessions__container__form__box-req 必須 36 %br/ 37 = f.password_field :password_confirmation, prefix:'',class:"sessions__container__form__box-inputbox",placeholder:"○文字以上の英数字" 38 %p ※ 英字と数字の両方を含めて設定してください 39 40 %input.pass-checkbox{type: "checkbox"} 41 %label.pass-checkbox パスワードを表示する 42 43 .sessions__container__form__box 44 %h3 本人確認 45 %p 安心・安全にご利用いただくために、お客さまの本人情報の登録にご協力ください。他のお客さまに公開されることはありません。 46 47 .field.sessions__container__form__box.clearfix 48 = f.label :first_name,"お名前(全角)",class:"sessions__container__form__box-title" 49 %span.sessions__container__form__box-req 必須 50 %br/ 51 = f.text_field :first_name, prefix:'', class:"container__form__box-inputbox-firstname",placeholder:"例)佐藤" 52 = f.text_field :last_name, prefix:'', class:"container__form__box-inputbox-lastname",placeholder:"例)太郎" 53 54 .field.sessions__container__form__box.clearfix 55 = f.label :last_name_kana,"お名前(カナ)",class:"sessions__container__form__box-title" 56 %span.sessions__container__form__box-req 必須 57 %br/ 58 = f.text_field :first_name_kana, prefix:'',class:"container__form__box-inputbox-firstname",placeholder:"例)サトウ" 59 = f.text_field :last_name_kana, prefix:'',class:"container__form__box-inputbox-lastname",placeholder:"例)タロウ" 60 61 .field.sessions__container__form__box 62 = f.label :birthday,"生年月日",class:"sessions__container__form__box-title" 63 %span.sessions__container__form__box-req 必須 64 %br/ 65 != sprintf(f.date_select(:birthday, prefix:'birthday', with_css_classes:'XXXXX', prompt:"--",use_month_numbers:true, start_year:Time.now.year, end_year:1900, date_separator:'%s'),'年','月')+'日' 66 67 .actions.sessions__container__form__box 68 = f.submit "新規登録",class:"sessions__container__form__box__submit" 69 70 = render "devise/shared/links" 71 72 %footer.footer 73 = render 'items/footer'

Ruby

1 2app/controller/apprication_controller.rb 3 4class ApplicationController < ActionController::Base 5 protect_from_forgery with: :exception 6 before_action :authenticate_user! 7 before_action :configure_permitted_parameters, if: :devise_controller? 8 9 protected 10 11 def configure_permitted_parameters 12 devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname, :first_name, :last_name, :first_name_kana, :last_name_kana, :birthday]) 13 end 14end

Ruby

1app/modele/user.rb 2 3class User < ApplicationRecord 4 # Include default devise modules. Others available are: 5 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 6 devise :database_authenticatable, :registerable, 7 :recoverable, :rememberable, :validatable 8 9 validates :nickname, :first_name, :last_name, :first_name_kana, :last_name_kana, presence: true 10 validates :password, length: { minimum: 7 }, 11 format: { with: /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i, message: "is must NOT contain any other characters than alphanumerics." } 12 validates :email, presence: true, 13 uniqueness:true, length:{ maximum: 255 }, 14 format: { with: /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i, message: "is must NOT contain any other characters than alphanumerics." } 15end
Processing by Users::RegistrationsController#new as HTML Rendering devise/registrations/new.html.haml within layouts/application Rendered items/_header.html.haml (243.4ms) Rendered devise/shared/_error_messages.html.haml (2.3ms) Rendered devise/shared/_links.html.haml (3.2ms) Rendered items/_footer.html.haml (4.9ms) Rendered devise/registrations/new.html.haml within layouts/application (284.3ms) Completed 200 OK in 365ms (Views: 349.5ms | ActiveRecord: 1.9ms) Started POST "/users" for ::1 at 2020-09-13 00:23:45 +0900 Processing by Users::RegistrationsController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"DXkzfxg+QrpZ7ayralkIq39M4V8giKYUz7CNiIHe6wUDuuv+YGXs1HAykVR1LsaATskbOa7CV7dJapAeNB+h1A==", "user"=>{"nickname"=>"池田 匠", "email"=>"bshuge02@gmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "first_name"=>"池田", "last_name"=>"匠", "first_name_kana"=>"イケダ", "last_name_kana"=>"タクミ"}, "birthday"=>{"birthday(1i)"=>"1997", "birthday(2i)"=>"1", "birthday(3i)"=>"14"}, "commit"=>"新規登録"} (0.2ms) BEGIN ↳ /Users/crest89/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.2.4.3/lib/active_record/log_subscriber.rb:98 User Exists (0.2ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY 'bshuge02@gmail.com' LIMIT 1 ↳ /Users/crest89/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.2.4.3/lib/active_record/log_subscriber.rb:98 CACHE User Exists (0.0ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY 'bshuge02@gmail.com' LIMIT 1 ↳ /Users/crest89/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.2.4.3/lib/active_record/log_subscriber.rb:98 User Create (0.5ms) INSERT INTO `users` (`nickname`, `email`, `encrypted_password`, `first_name`, `last_name`, `first_name_kana`, `last_name_kana`, `created_at`, `updated_at`) VALUES ('池田 匠', 'bshuge02@gmail.com', '$2a$12$5ArAvrs0AjRQ.DkybFzxJuZust3y9fmXbBn/xCQiKOff6NwYsmqz6', '池田', '匠', 'イケダ', 'タクミ', '2020-09-12 15:23:46', '2020-09-12 15:23:46') ↳ /Users/crest89/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.2.4.3/lib/active_record/log_subscriber.rb:98 (0.1ms) ROLLBACK ↳ /Users/crest89/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.2.4.3/lib/active_record/log_subscriber.rb:98 Completed 500 Internal Server Error in 195ms (ActiveRecord: 1.0ms) ActiveRecord::NotNullViolation (Mysql2::Error: Field 'birthday' doesn't have a default value: INSERT INTO `users` (`nickname`, `email`, `encrypted_password`, `first_name`, `last_name`, `first_name_kana`, `last_name_kana`, `created_at`, `updated_at`) VALUES ('池田 匠', 'bshuge02@gmail.com', '$2a$12$5ArAvrs0AjRQ.DkybFzxJuZust3y9fmXbBn/xCQiKOff6NwYsmqz6', '池田', '匠', 'イケダ', 'タクミ', '2020-09-12 15:23:46', '2020-09-12 15:23:46')):

試したこと

daviseやdate_selectについて検索してみたがどれもコントローラーを分離させてる物やコントローラーの記述が無いものが多かった

補足情報

ruby '2.5.1'
gem 'rails', '~> 5.2.4', '>= 5.2.4.3'
gem 'mysql2', '>= 0.4.4', '< 0.6.0'
gem 'devise'

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unhappychoice

2020/09/12 16:32

> 発生している問題・エラーメッセージ が、エラーではないかつ問題でもないように見えますが、何が問題でしょうか users テーブルに birthday が保存されないこと?
takumi_erb

2020/09/12 16:53

はい データベースにはbirthdayカラムが存在するんですが、birthday(1i),birthday(2i),birthday(3i)に分離してるからハッシュを拾えないのかな考えてるんですが、deviseでコントローラーを実装してないためどこでcreateアクションを行っているのか分から八方塞がりがり状態です
unhappychoice

2020/09/12 16:59 編集

Processing by Users::RegistrationsController#create as HTML 以下のリクエストすべてのログの掲載が必要かと思います。 ちなみに StrongParemeter に関しては birthday(1i),birthday(2i),birthday(3i) に関しては permit(:birthday) で許可できるはずかと思います。
unhappychoice

2020/09/12 17:04

ちなみに、 rails generate devise:controllers users すればデフォルト実装のコントローラーが生成されます。(つまり動作は変わらず、カスタマイズできるようになる
takumi_erb

2020/09/12 17:24

コントローラ生成をしてアクションを追加してみます! つまりコントローラーの入力内容の保存のアクションだけ編集すればいいのでしょうか?(create、saveアクションなど)
guest

回答1

0

ベストアンサー

見づらいので軽く整理すると

ruby

1 { 2 "utf8" => "✓", "authenticity_token" => "略", 3 "user" => {}, 4 "birthday" => { 5 "birthday(1i)" => "1997", "birthday(2i)" => "1", "birthday(3i)" => "14" 6 }, 7 "commit" => "新規登録" 8 }

ネストしている事が問題なのではなく
birthdayがuserに入ってない事が問題の可能性があります。

なぜこうなるか

!= sprintf(f.date_select(:birthday, prefix:'birthday', with_css_classes:'XXXXX', prompt:"--",use_month_numbers:true, start_year:Time.now.year, end_year:1900, date_separator:'%s'),'年','月')+'日'

ここでprefix'birthday'に設定しているためです。

他のtext_fieldなどのprefixについても不要ならば消してしまった方がよいと思います。

投稿2020/09/13 00:16

asm

総合スコア15149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takumi_erb

2020/09/13 09:44

みなさん ありがとうございます! perfixのところをuserに変えたuser内にネストして拾えるようになりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問