LoginSignup
2
1

More than 3 years have passed since last update.

フォームオブジェクトを作る際にハマったこと

Posted at

モデルの関係性

大まかなモデルは以下のモデルで、あとで出てくるprefectureはアクティブハッシュ を採用している。
userモデル :ユーザー情報
itemモデル :商品情報
orderモデル :購入記録、user_id、item_id を保存したい
order_addressモデル :購入者住所、orderモデル生成時にできるorder_idを保存したい
order_formモデル(フォームオブジェクト)
(prefecture)モデル

オブジェクトフォーム

class OrderForm
  include ActiveModel::Model
  attr_accessor :user_id, :item_id, :postal_code, :prefecture_id, :municipality, :address, :building_name, :phone_number

  with_options presence: true do
    validates :user_id
    validates :item_id
    validates :order_id
    validates :postal_code, format: {with: /\A[0-9]{3}-[0-9]{4}\z/, message: "Input correctly"}
    validates :prefecture_id, numericality: { other_than: 0, message: 'Select' }
    validates :municipality
    validates :address
    validates :phone_number, format: {with: /\A\d{10}\z|\A\d{11}\z/ , message: "Input only number"}
  end

  def save
    order = Order.create(user_id: user_id, item_id: item_id)

    OrderAdress.create(postal_code: postal_code, prefecture_id: prefecture_id, municipality: municipality, address: address, phone_number: phone_number, building_name: building_name, order_id: order.id)
  end
end

疑問点

order_idも保存したいからattr_accessorのなかに記述するのでは?

結論

『order_id』はorderが生成されたと同時に作られるから、そこにはかけない
attr_accessorの部分はhtmlファイルのフォーム部分で保存したいものの記述
のため、フォームでの段階では保存されない

前提として 保存の順番は orderテーブル  →  order_adressテーブル (order_idが必要)

だから、attr_accessorの段階ではorder_adressテーブルに保存したいorder_id
は作られていないから、そこにはかけない

saveの意味
def save の部分中身の意味はorderコントローラーの記述も見ないとわからない

フォームオブジェクトを振り返ってみて出てきた疑問

今回は1対1の関係性でフォームオブジェクトを使っていたが、
1対多のときは使うことができるのか?使い方は?

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