##経緯
ポートフォリオ作成中にモデルの保存がなかなかできずにハマってしまった。
「pry-rails」というgemを使うことで解決できたのでメモします。
##コントローラ
以下のようなコード、メソッドを組んでました。
class User::RecordsController < User::Base
##中略...
def create
@record = current_app_user.records.build(record_params)
if @record.save
flash[:success] = '正常に入力されました'
redirect_to user_root_url
else
flash.now[:danger] = '正常に入力されませんでした'
render :new
end
end
##中略...
private def record_params
params.require(:record).permit(
:material,
:study_date,
:study_hour,
:study_minute,
:memo,
)
end
end
##モデル
モデル名:record
カラムは以下の通りです。
["id", :integer]
["material", :string] #教材を入れたい
["study_date", :date] #日付を入れたい
["study_hour", :integer] #勉強時間(hour)を入れたい
["study_minute", :integer] #勉強時間(minute)を入れたい
["memo", :string] #メモがきを入れたい
["app_user_id", :integer]
["created_at", :datetime]
["updated_at", :datetime]
##解決手順
Gemfileに以下追記
group :development, :test do
gem 'pry-rails'
end
ターミナルにてbundle install
$bundle install
クリエイトメソッドに追記
class User::RecordsController < User::Base
##中略...
def create
binding.pry #こいつを追記すること!!
@record = current_app_user.records.build(record_params)
if @record.save
##中略...
その上で、保存を試して見よう。そうするとGUIは待機状態になり
ターミナル上でコマンドライン操作が可能になる。
以下画面になる。
From: /apps/study-meter/app/controllers/user/records_controller.rb:20 User::RecordsController#create:
19: def create
=> 20: binding.pry
21: @record = Record.new(record_params)
22: if @record.save
23: flash[:success] = '正常に入力されました'
24: redirect_to user_root
25: else
26: flash.now[:danger] = '正常に入力されませんでした'
27: render :new
28: end
29: end
[1] pry(#<User::RecordsController>)>
ここで、paramsと入力。すると
[1] pry(#<User::RecordsController>)> params
=> <ActionController::Parameters {"authenticity_token"=>"y5Y+hutJRPbyX9VM0lpiIax4hfeF5TXoykVL35fLQV727TmH/+/f/qncyRtDaANL1h5kqIOErcrGRhfCYuYCKg==", "record"=>{"study_date"=>"2020-07-14", "memo"=>"日本史", "study_hour"=>"0", "study_minute"=>"3"}, "commit"=>"投稿", "host"=>"study-meter.com", "controller"=>"user/records", "action"=>"create"} permitted: false>
こうみてみると、どのカラムになんの値を入れようとしていたのかがわかる。
「memo」のカラムには、メモがきを入れようとしており、materialのカラムに、「日本史」を入れようとしていた。
それなのにmemoのカラムに日本史が入っているたり、materialのカラムにはそもそも入力がされてない。
そこで、「おかしい」と気づく。
materialはnot null制約をしていたから
「materialはnilじゃ駄目なのにnilのまま保存しようとするってどういうことやねん。」という流れで
保存がうまくいかなかったのでしょう。
・メソッドは問題ないはず
・意図しないカラム意図しないカラムを入力しようとしてる
この点からviewのformの書き方がおかしいとあたりをつけることができた。
案の定そこのコードがおかしかったのでそこを直して解決した。
##結論
pry-railsは、エラー原因特定にすごく便利なライブラリでした。