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

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

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

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

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

2504閲覧

RailsでParamsの中身をDBに保存できない

_summer_sn

総合スコア2

Ruby

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

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/04/24 14:11

前提・実現したいこと

Railsで確認画面を表示するお問い合わせページを作成しています。
new(情報登録画面)→ confirm(内容確認画面)→ create(送信完了画面)
という流れで実装しております。

この流れは正常に行くのですが、DBの中身がNULLになってしまいます。
原因が分からずつまづいてしまっているので、皆様のお力を頂戴したいです。

発生している問題

confirm → createに移動する際、おそらく@contactのparams[:name, :email, :text]の情報がnilになっている。
そのためDBの上記の中身がNULLになってしまう。

該当のソースコード

routes.rb

ruby

1 get 'contacts' => 'contacts#new' #問い合わせトップ 2 post 'contacts/confirm' => 'contacts#confirm' #確認画面 3 post 'contacts/create' => 'contacts#create' #送信完了画面

contacts_controller.rb

ruby

1class ContactsController < ApplicationController 2 3 def new 4 @contact = Contact.new 5 end 6 7 def confirm 8 @contact = Contact.new(contact_params) 9 render :new if @contact.invalid? 10 end 11 12 def create 13 @contact = Contact.new(contact_params) 14 15 if params[:back] 16 render :new 17 return 18 end 19 20 if params[:post] 21 @contact.save 22 return 23 end 24 25 end 26 27 private 28 def contact_params 29 params.permit(:name, :email, :text) 30 end 31end

new.html.erb

erb

1<%= form_with(model: @contact, local: true, url: {action: 'confirm'}) do |form| %> 2 <% if @contact.errors.any? %> 3 <div id="error_explanation"> 4 <h2><%= pluralize(post.errors.count, "error") %> prohibited this post from being saved:</h2> 5 6 <ul> 7 <% @contact.errors.full_messages.each do |message| %> 8 <li><%= message %></li> 9 <% end %> 10 </ul> 11 </div> 12 <% end %> 13 14 <div class="field"> 15 <%= form.label :name %> 16 <%= form.text_field :name %> 17 </div> 18 19 <div class="field"> 20 <%= form.label :email %> 21 <%= form.text_field :email %> 22 </div> 23 24 <div class="field"> 25 <%= form.label :text %> 26 <%= form.text_area :text %> 27 </div> 28 29 <div class="actions"> 30 <%= form.submit "確認画面へ" %> 31 </div> 32<% end %>

confirm.html.erb

erb

1<%= form_for @contact, url: contacts_create_path do |f| %> 2 <%= @contact.name %> 3 <%= @contact.email %> 4 <%= @contact.text %> 5 <div class="actions"> 6 <%= f.submit '投稿画面に戻る', name: 'back' %> 7 </div> 8 <div class="actions"> 9 <%= f.submit '投稿する', name: 'post'%> 10 </div> 11<% end %>

試したこと

contacts_controller.rbのcreateアクション内にbinding.pryを入れて確認したところ、@contactの中身が全てnilでした。

form_withをform_tagやform_forなどに書き換えてみたり、バリデーションを入れたり取ったりしましたが変化がありませんでした。

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

rails -v 5.2.1/ruby -v 2.5.1です。

DBに追加したカラムは以下の通りです。
t.string :name
t.string :email
t.text :text

その他必要な情報があれば教えてください。
よろしくお願いします!

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

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

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

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

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

guest

回答1

0

ベストアンサー

現在のconfirm.html.erbでは、パラメータがCreateアクションに送られていないかと思われます。
例えば、ReadOnlyでFormをちゃんと生成してあげると、Createアクションにパラメータが送られる用人ら雨かもです。

erb

1<%= form_for @contact, url: contacts_create_path do |f| %> 2 <div class="field"> 3 <%= form.label :name %> 4 <%= form.text_field :name, value: @contact.name, readonly: true %> 5 </div> 6 7 <div class="field"> 8 <%= form.label :email %> 9 <%= form.text_field :email, value: @contact.email, readonly: true %> 10 </div> 11 12 <div class="field"> 13 <%= form.label :text %> 14 <%= form.text_area :text, value: @contact.text, readonly: true %> 15 </div> 16 <div class="actions"> 17 <%= f.submit '投稿画面に戻る', name: 'back' %> 18 </div> 19 <div class="actions"> 20 <%= f.submit '投稿する', name: 'post'%> 21 </div> 22<% end %> 23

投稿2020/04/24 15:13

hatsu

総合スコア1809

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

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

_summer_sn

2020/04/24 16:25

ご回答ありがとうございます! 頂いたコードを元に再編集してみましたが、`new.html.erb`から`confirm.html.erb`までの受け渡しも上手くいっていなかった?ようで...また沼にはまってしまいました。 また他にアイデアがあればぜひ教えてください><
hatsu

2020/04/24 22:58

そうなのですね。newから confirm画面へ遷移したさいのログを貼っていただいてもよろしいでしょうか? またconfirmでform.と書かれていますがf.ですね。
_summer_sn

2020/04/25 06:14

hatsuさん、ご返信ありがとうございます! 初歩的な質問で申し訳ないのですが、ログというのはページ遷移した際のターミナルで良いのでしょうか...? Started POST "/contacts/confirm" for ::1 at 2020-04-25 15:11:14 +0900 Processing by ContactsController#confirm as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"zJpcd+ejTOZyunnm4lW6cZgJ9rmZcdf6ZPZv2EGHmCZgQSr3Q5BFsKJrIlyTCkJqcX6vCRkQkmnrQKhHgtkG2w==", "contact"=>{"name"=>"aaa", "email"=>"bbb", "text"=>"ccc"}, "commit"=>"確認画面へ"} Unpermitted parameters: :utf8, :authenticity_token, :contact, :commit Rendering contacts/confirm.html.erb within layouts/application Rendered contacts/confirm.html.erb within layouts/application (5.7ms) Completed 200 OK in 119ms (Views: 113.6ms | ActiveRecord: 0.0ms) |f|の部分は全てformに訂正して利用させていただいております!
hatsu

2020/04/25 06:17

はい、ログあっています。 こちらは確認画面の表示ですね。Parameters: とあるように確認画面ではパラメータの取得はできているようにみえます。 >`new.html.erb`から`confirm.html.erb`までの受け渡しも上手くいっていなかった と書かれていましたが、確認画面では何かエラーがありましたか?
_summer_sn

2020/04/25 06:23

ありがとうございます! >`new.html.erb`から`confirm.html.erb`までの受け渡しも上手くいっていなかった というのはエラーが出たわけではなく、`confirm.html.erb`にbinding.pryをして@contactの中身を確認したところ、 [2] pry(#<#<Class:0x00007f8c75d71780>>)> @contact => #<Contact:0x00007f8c76e71350 id: nil, name: nil, email: nil, text: nil, created_at: nil, updated_at: nil> という結果が返ってきたためもしかして...と思った所存です。。
hatsu

2020/04/25 06:28

なるほどです。contact_paramsメソッドを以下のようにするといかがでしょうか? params.require(:contact).permit(:name, :email, :text)
_summer_sn

2020/04/25 06:43

いけました!!!涙 本当にありがとうございます!!! 心の底から感謝申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問