1
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.

createメソッドでDBに保存されなかった

Posted at

#WHY
createメソッドが行われているものの、DBをみてみると情報が保存されておらず、教えてもらったことを深く刻み込むため、アウトプットしていきます。


##今回の問題
今回はフォームオブジェクトを作成し、2つのテーブルにデータを保存しようというもの
それではコードをみてみます。

def create
    @management_address = ManagementAddress.new(management_params)
    if @management_address.valid?
      @management_address.save
      redirect_to root_path
    else
      render :index
    end
end

保存処理を行うコントローラーでバリデーションをうまくクリアできたとき、
saveメソッドを行い、root_pathへリダイレクトするというもの。

そしてフォームオブジェクトがこちら

include ActiveModel::Model
  attr_accessor :add_num,:area_id,:city,:add_line,:add_build,
                :tel_num,:item_id,:user_id,:management_id
#省略
def save
    management = Management.create(user_id: user_id, item_id: item_id)
    Address.create(add_num: add_num, area_id: area_id, city: city,
                   add_line: add_line, add_build: add_build,
                   tel_num: tel_num, management_id: management.id)
end

attr_accessorと、saveメソッドです。
コントローラーのsaveメソッドを行なった場合このように二つのテーブルにcreateします。

そして今回起きたのが
「フォームから情報を入力し送信すると無事、トップページへリダイレクトされた。しかしDBを確認するとデータが入ってない!!」
ということです。

##問題を探る
そこで行なったのがこちら

  • binding.pryでparamsに情報が入っているのか
  • スペルミス等ないか要確認
  • メソッドに「!」をつけて強行手段!!

まずはbinding.pry

def create
    binding.pry
    @management_address = ManagementAddress.new(management_params)
    if @management_address.valid?
      @management_address.save
      redirect_to root_path
    else
      render :index
    end
end

きちんとparamsにデータがはいっているのか、、、
ターミナル↓

[1] pry(#<ManagementsController>)> management_params
=> <ActionController::Parameters {"add_num"=>"000-0000", "area_id"=>"2", "city"=>"test",
                     "add_line"=>"test", "add_build"=>"test", 
                    "tel_num"=>"09011112222", "user_id"=>2, "item_id"=>"8"} permitted: true>
[2] pry(#<ManagementsController>)> 

はいっています。次にスペルミス、変数の記述ミスを要確認.....

....どこも間違ってない!!

続いては新しく覚えた技「!マーク」
メソッドの後につけると強行的にその動作を行い、不足しているデータはnilとして保存したりします。
ということでcreateメソッドの後につけます。

フォームオブジェクト↓

def save
    management = Management.create!(user_id: user_id, item_id: item_id)
    Address.create(add_num: add_num, area_id: area_id, city: city,
                   add_line: add_line, add_build: add_build,
                   tel_num: tel_num, management_id: management.id)
end

そして実行してみるとこのようなエラーが...!
hash.png

どうもActiveHashのareaが怪しい...
しかしManagementsテーブルにはarea_idとは関係ありません。
DBを確認してarea_idをみてみます。

Managementsテーブル
management.png
Addressesテーブル
address.png

area_idのカラムは正しいテーブルにありました。
マイグレーションファイルも同様に、、、

それではつづいてareaのモデルファイルをみてみると、、、

include ActiveHash::Associations
  has_many :items
  has_many :managements

という表記が!!

area_idを保存するテーブルはmanagementsでなくaddressesなので完全ここですね!!

include ActiveHash::Associations
  has_many :items
  has_many :addresses

そしてそのままmanagementモデルのアソシエーションを消し、addressモデルにアソシエーションを記述します!

extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to :area

このあとは無事DBに保存することができました!!


今回学んだことは「!」マークの使い方でした!!現役の方でも使う方が多くいるようなので頭に深く刻んどきます!!

1
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
1
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?