【概要】
1.結論
2.Formオブジェクトとは
3.使用方法
4.ここから学んだこと
1.結論
Formオブジェクトを使う!
2.Formオブジェクトとは ---------------------------------------- 複数のテーブルに1度に保存できる方法です! 本来であれば保存したいテーブル分のコントローラー、モデルmigrateファイルを作らなければなりません。この場合ですと、モデルとある一つのファイルをつくるだけで簡単にできます!
3.使用方法 ---------------------------------------- ❶appにformオブジェクト専用のフォルダとその中にファイルをつくります。そして以下のように記述します。今回は購入された情報と住所をDBに反映させたいのでsellitem_addressにします!
class SellitemAddress
include ActiveModel::Model
attr_accessor :postal_code, :shipping_orig_id, :city, :address_other, :building_name,
:telephone_num, :sell_item_id, :user_id, :buy_item_id
end
:user_idは新規登録したユーザー、
:buy_item_idは売られている商品になります。
include ActiveModel::Modelを記載しincludeすることで、モデルのように扱えてここにバリデーションの記載もできます!
attr_accessorはメソッド内の記述をメソッド外の時に変更を加えれるようにできるメソッドです!つまりインスタンス変数として扱えるようになり、ゲッターとセッターの内部処理を行っています!
❷使用したいモデルに対して情報を記載します。
def save
sell_item = SellItem.create(user_id: user_id, buy_item_id: buy_item_id)
Address.create(postal_code: postal_code, shipping_orig_id: shipping_orig_id, city: city, address_other: address_other, building_name: building_name,telephone_num: telephone_num, sell_item_id: sell_item.id )
end
このようにすることでDBに保存できるカラムの設定を行いました!
user_id buy_item_idとなっているのは
既にuserのidとbuy_itemのidを設定しているのでidごとそのまま抜き取りたい設定をしています!
❸ビューで入力した情報をコントローラーがDBに登録できるように指示を出すように設定します。
def create
@sell_item = SellitemAddress.new(sell_item_params)
if @sell_item.save
return redirect_to root_path
else
render 'sell_items/index'
end
private
def sell_item_params
params.permit(:postal_code, :shipping_orig_id, :city, :address_other, :building_name, :telephone_num, :user_id, :buy_item_id).merge(user_id: current_user.id)
end
end
sell_item_paramsメソッドの中では、モデルで設定した情報を記載し、それを保存する際にsell_item_paramsとしてまとめています。こうすることで各カラムがどのテーブルに保存されるかを判断してくれるので非常に便利です!
読み込む記述も少なくなるので動作に負荷を与えずに済みます!
4.ここから学んだこと ---------------------------------------- 本来であれば、コントローラーとモデルとmigrateファイルを保存したいテーブル分作り、viewと連携させて行います。また各コントローラーと連携するのか、各入力部分において各コントローラーに指示ださないといけないです。拡張性の部分でもエラーが発生する可能性は大いにあります。この方法なら保守性・可読性が上がり、各コントローラーに指示を出すより動作に負荷を与えずに済みます!