前提・実現したいこと
Railsで確認画面を表示するお問い合わせページを作成しています。
index(情報登録画面)→ confirm(内容確認画面)→ complete(送信完了画面)
という流れで実装しております。
この流れは正常に行くのですが、DBの中身がNULLになってしまいます。
原因が分からずつまづいてしまっているので、皆様のお力を頂戴したいです。
発生している問題・エラーメッセージ
confirm → completeに移動する際、DBに空で入ってしまいます。
rails c でコンソールから直接書き込もうとしてもNilになってしまいます。
該当のソースコード
/controller/contact_controller.rb
Ruby
1class ContactController < ApplicationController 2 def index 3 @contact = Contact.new 4 render :action => 'index' 5 end 6 def confirm 7 @contact = Contact.new(contact_params) 8 if @contact.valid? 9 render :action => 'confirm' 10 else 11 render :action => 'index' 12 end 13 end 14 15 def complete 16 @contact = Contact.new(contact_params) 17 binding.pry #ここで一度処理を止めている 18 ContactMailer.received_email(@contact).deliver 19 if @contact.save 20 render :action => 'complete' 21 else 22 render :action => 'index' 23 end 24 end 25 26 private 27 def contact_params 28 params.require(:contact).permit(:name, :mail, :mail_confirmation, :message) 29 end 30end
/model/contact.rb
Ruby
1class Contact < ApplicationRecord 2 include ActiveModel::Model 3 4 attr_accessor :name, :mail, :mail_confirmation, :message 5 6 validates :name, 7 presence: {:message => '名前を入力してください'} 8 9 VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i 10 11 validates :mail, 12 length: {maximum: 255}, 13 presence: {:message => 'メールアドレスを入力してください'}, 14 format: { with: VALID_EMAIL_REGEX } 15 16 validates_confirmation_of :mail, 17 length: {maximum: 255}, 18 presence: {:message => 'メールアドレスを入力してください'}, 19 format: { with: VALID_EMAIL_REGEX } 20 21 validates :message, 22 length: {maximum: 255} 23 24end 25
/view/confirm.html.haml
Haml
1.contactContents 2 .page-header 3 %h1 お問い合わせ 4 = form_for @contact, :url => contact_complete_path do |f| 5 %table.table 6 %tr 7 %th 名前 8 %td 9 = f.hidden_field :name 10 = @contact.name 11 %tr 12 %th メールアドレス 13 %td 14 = f.hidden_field :mail 15 = f.hidden_field :mail_confirmation 16 = @contact.mail 17 %tr 18 %th お問い合わせ内容 19 %td 20 = f.hidden_field :message 21 = simple_format(@contact.message) 22 = f.submit '送信', :class => 'btn btn-primary' 23
試したこと
binding.pryを試した場合
terminal
1 17: def complete 2 18: # メール送信 3 19: @contact = Contact.new(contact_params) 4 => 20: binding.pry 5 21: ContactMailer.received_email(@contact).deliver 6 22: if @contact.save 7 23: render :action => 'complete' 8 24: else 9 25: render :action => 'index' 10 26: end 11 27: end 12 13[1] pry(#<ContactController>)> @contact 14=> #<Contact:0x00007f9f97b3f310 id: nil, name: nil, mail: nil, mail_confirmation: nil, message: nil, created_at: nil, updated_at: nil> 15[2] pry(#<ContactController>)> contact_params 16=> <ActionController::Parameters {"name"=>"Taro", "mail"=>"test@sample.com", "mail_confirmation"=>"test@sample.com", "message"=>"hello world"} permitted: true> 17[3] pry(#<ContactController>)>
if contact.save! を試した場合
terminal
1Started GET "/contact" for ::1 at 2021-01-27 17:51:17 +0900 2Processing by ContactController#index as HTML 3 Rendering contact/index.html.haml within layouts/application 4 Rendered contact/index.html.haml within layouts/application (3.8ms) 5 Rendered layouts/_flash.html.haml (1.3ms) 6 Rendered layouts/_main_header.html.haml (6.7ms) 7 Rendered layouts/_session_controller.html.haml (2.2ms) 8 Rendered layouts/_main_footer.html.haml (5.7ms) 9Completed 200 OK in 218ms (Views: 206.9ms | ActiveRecord: 1.9ms) 10 11 12Started POST "/contact/confirm" for ::1 at 2021-01-27 17:51:33 +0900 13Processing by ContactController#confirm as HTML 14 Parameters: {"utf8"=>"✓", "authenticity_token"=>"1udTs/YkCfBWq5tGcPve+X0FY6x4tCrzj/1R+XL8xdZxjtGmE30n0Mx0krayDKHWBeddQLc4AntxF0XivHsq8g==", "contact"=>{"name"=>"test", "mail"=>"test@sample.com", "mail_confirmation"=>"test@sample.com", "message"=>"sample"}, "commit"=>"確認"} 15 Rendering contact/confirm.html.haml within layouts/application 16 Rendered contact/confirm.html.haml within layouts/application (3.2ms) 17 Rendered layouts/_flash.html.haml (1.3ms) 18 Rendered layouts/_main_header.html.haml (3.3ms) 19 Rendered layouts/_session_controller.html.haml (1.5ms) 20 Rendered layouts/_main_footer.html.haml (3.6ms) 21Completed 200 OK in 67ms (Views: 66.3ms | ActiveRecord: 0.0ms) 22 23 24Started POST "/contact/complete" for ::1 at 2021-01-27 17:51:35 +0900 25Processing by ContactController#complete as HTML 26 Parameters: {"utf8"=>"✓", "authenticity_token"=>"ACdr0CyeD2YCH6u8hwilPj6N6fXGWLyxL7rDl6vVnPinTunFycchRpjAokxF/9oRRm/XGQnUlDnRUNeMZVJz3A==", "contact"=>{"name"=>"test", "mail"=>"test@sample.com", "mail_confirmation"=>"test@sample.com", "message"=>"sample"}, "commit"=>"送信"} 27 Rendering contact_mailer/received_email.text.haml 28 Rendered contact_mailer/received_email.text.haml (1.1ms) 29ContactMailer#received_email: processed outbound mail in 9.7ms 30/usr/bin/open file:////Users/01018540/projects/reframe-lab/tmp/letter_opener/1611737495_265122_610c5dc/plain.html 31Sent mail to test@sample.com (6.5ms) 32Date: Wed, 27 Jan 2021 17:51:35 +0900 33From: example@example.com 34To: test@sample.com 35Message-ID: <6011299740a42_16a923fcfe39839cc381d9@CA6383.local.mail> 36Subject: =?UTF-8?Q?=E3=81=8A=E5=95=8F=E3=81=84=E5=90=88=E3=82=8F=E3=81=9B=E3=82=92=E6=89=BF=E3=82=8A=E3=81=BE=E3=81=97=E3=81=9F?= 37Mime-Version: 1.0 38Content-Type: text/plain; 39 charset=UTF-8 40Content-Transfer-Encoding: base64 41 42V2Vi44K144Kk44OI44GL44KJ44GK5ZWP44GE5ZCI44KP44Gb44GM44GC44KK 4344G+44GX44Gf44CCDQrllY/jgYTlkIjjgo/jgZvnlLvpnaLjgaflhaXlipvj 44gZXjgozjgZ/msI/lkI06IHRlc3QNCuWVj+OBhOWQiOOCj+OBm+eUu+mdouOB 45p+WFpeWKm+OBleOCjOOBn+ODoeODvOODq+OCouODieODrOOCuTogdGVzdEBz 46YW1wbGUuY29tDQrllY/jgYTlkIjjgo/jgZvlhoXlrrk6DQpzYW1wbGUNCg== 47 48 (0.2ms) BEGIN 49 ↳ app/controllers/contact_controller.rb:23 50 Contact Create (0.6ms) INSERT INTO `contacts` (`created_at`, `updated_at`) VALUES ('2021-01-27 08:51:35', '2021-01-27 08:51:35') 51 ↳ app/controllers/contact_controller.rb:23 52 (2.0ms) COMMIT 53 ↳ app/controllers/contact_controller.rb:23 54 Rendering contact/complete.html.haml within layouts/application 55 Rendered contact/complete.html.haml within layouts/application (1.9ms) 56 Rendered layouts/_flash.html.haml (1.0ms) 57 Rendered layouts/_main_header.html.haml (2.8ms) 58 Rendered layouts/_session_controller.html.haml (1.4ms) 59 Rendered layouts/_main_footer.html.haml (4.1ms) 60Completed 200 OK in 85ms (Views: 57.0ms | ActiveRecord: 2.8ms)
コンソールで直接追加を試行
rails
1$ bundle exec rails c 2Loading development environment (Rails 5.2.4.4) 3[1] pry(main)> 4[2] pry(main)> contact = Contact.create(name:"Taro", mail:"test@gmail.com", mail_confirmation: "test@gmail.com", message: "hello world") 5 (0.4ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483 6 (0.1ms) BEGIN 7 Contact Create (0.3ms) INSERT INTO `contacts` (`created_at`, `updated_at`) VALUES ('2021-01-28 09:20:20', '2021-01-28 09:20:20') 8 (0.6ms) COMMIT 9=> #<Contact:0x00007fb75bc29f10 10 id: 24, 11 name: nil, 12 mail: nil, 13 mail_confirmation: nil, 14 message: nil, 15 created_at: Thu, 28 Jan 2021 18:20:20 JST +09:00, 16 updated_at: Thu, 28 Jan 2021 18:20:20 JST +09:00> 17[3] pry(main)>
補足情報(FW/ツールのバージョンなど)
versions
1ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin19] 2rails 5.2.4.4 3mysql Ver 14.14 Distrib 5.7.32, for osx10.15 (x86_64) using EditLine wrapper
model Contact のcodeを載せてください。
どんなエラーなのか見たいので if @contact.save! !をつけて実行してください
winterboum様
ご確認いただきありがとうございます。
認識不足でしたら申し訳ございませんが、「/model/contact.rb」をすでに載せているのですがこちらではございませんでしょうか?
> if @contact.save! !をつけて実行してください
こちら実行しましても特にエラーなどは出ておりません。
正常に終了しているように見えますがDB上にデータが「NULL」で追加されております。。
「試したこと」にログを載せましたのでご確認ください。
(やはりDBに書き込みはできてないです。。。)
う〜〜〜む
理解不能なことが2件
binding.pryを試した場合PARAMSには値があるのに、modelには入っていない
validationではnameとか必須なのに、データ無しでsaveしてエラーにならない
他の質問の方でwinterboum様からご回答いただいたもので無事に解決しました!
https://teratail.com/questions/319118
本当にありがとうございました!
回答1件
あなたの回答
tips
プレビュー