#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
どうもActiveHashのareaが怪しい...
しかしManagementsテーブルにはarea_idとは関係ありません。
DBを確認してarea_idをみてみます。
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に保存することができました!!
今回学んだことは「!」マークの使い方でした!!現役の方でも使う方が多くいるようなので頭に深く刻んどきます!!