0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Rails】createメソッドで保存ができない時に使える「pry-rails」

Posted at

##経緯
ポートフォリオ作成中にモデルの保存がなかなかできずにハマってしまった。
「pry-rails」というgemを使うことで解決できたのでメモします。

##コントローラ

以下のようなコード、メソッドを組んでました。

records_controller.rb
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に以下追記

Gemfile.
group :development, :test do
  gem 'pry-rails'
end

ターミナルにてbundle install

$bundle install

クリエイトメソッドに追記

records_controller.rb
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は、エラー原因特定にすごく便利なライブラリでした。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?