kobasaです(´ω`*)
早いものでテックキャンプエンジニア転職コースを受講してから3ヶ月が経ちました。
受講期間としては折り返しに入ります。ペース的には大分余裕はあるんですが、知識的には、どうでしょうね?
現在の技術を問われれば、
「Railsを使ったアプリの簡単なサーバーサイドの読み書きができます!」「フロントは多少読めますが、一から書くのは怪しいです!」
こんな感じ?まだまだってことですね(´・ω・`)
91日目のまとめ
次の「商品購入機能」の実装に伴い、2項目勉強しておくことがあるみたいなので今日はそちらを。
Formオブジェクトパターンについて
1つのフォームから送信した情報を複数のテーブルに保存する方法のこと。
Formオブジェクトパターンを使用しないとかなり面倒な記述になるらしい。
Formオブジェクトパターンの利点
- 1つのフォームからの情報を複数のテーブルに保存できる
- form_withメソッドのmodelオプションの引数にできる
- 入力不備があればページに留まらせ、エラーメッセージを表示できる
- バリデーションに対応できる
複数のテーブルへデータを保存する処理や、バリデーションを記述したモノを新たに作り、
フォームとコントローラーのやり取りは新しく作ったモノを使用する感じ?説明が難しい。
Formオブジェクトパターン手順
クラスの記述
①modelディレクトリにファイルを作成し、クラスを定義する。
ファイル名・クラス名などは中間テーブルのような感じで
ファイル名:donation_address.rb クラス名:DonationAddress
モデルの一部の機能を持たせる記述と、保存したいカラム名を扱える記述
include ActiveModel::Model
attr_accessor :カラム名, :カラム名, … #保存するカラム名を全て記述
②バリデーションを記述する。こちらに記述するのでモデルには記述しなくて良い。
belongs_toの記述がこのファイルにはないのでpresence: trueを親モデルのidに追記するのを忘れない。
validate :user_id, presence: true
③データをテーブルに保存する処理を記述する。
donationとaddressは1対1の関係でorderが親になるため、まずは親であるdonationのデータを保存する。
その後にaddressのデータと保存されたdonationのidを保存する。
def save
donation = Donation.create(price: price, user_id: user_id)
Address.create(postal_code: postal_code, prefecture: prefecture, … donation_id: donation.id)
end
コントローラーの記述
def new
@donation_address = DonationAddress.new
end
def create
@donation_address = DonationAddress.new(donation_params)
if @donation_address.valid?
@donation_address.save
redirect_to root_path
else
render :new
end
end
private
def donation_params
params.require(:donation_address).permit(:postal_code, :prefecture, … :price).merge(user_id: current_user.id)
end
インスタンス変数名やモデル名が新たに生成したモノに変わったくらいで大体いつもと同じ。
注意点は@donation_address.valid?の記述。
DonationAddressクラスのsaveメソッドにはバリデーションを実行する機能がないため、ここに記述する必要がある。
あとはフォームに定義したインスタンス変数を記述して完了。
掻い摘んで書くとこんな感じだと思う。あとは実際に実装できるかどうかですね(´ω`*)
コメント