Formオブジェクトパターンを理解する④二つのテーブルのデータを１つのクラスで扱う1-1

用意するクラスは
usersテーブルとdonationsテーブル

モデルクラス名の命名規則

・複数単語の場合

|名称|例|解説|
|-|-|-|
|モデル名|cancel reason|	
|モデルクラス名|CancelReason|先頭大文字・キャメル・単数形
|ファイル名|cancel_reason.rb|先頭小文字・スネーク・単数形
|テーブル名|cancel_reasons|先頭小文字・スネーク・複数形

>@gakkieさん感謝
>https://qiita.com/gakkie/items/3afcd505c786364aa5fa

モデルにファイルを作成
-

ファイル名はスネークケースで「user_donation.rb」で
![20210424-132853.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/a998952b-2cc2-406d-018a-e7de50213909.png)

include ActiveModel::Model
-

作ったファイルにコードを入力します。

```rb:models/user_donation.rb
class UserDonation
  include ActiveModel::Model
end
```
*モデルクラス名は先頭大文字のキャメルケースになります
*バリデーションもかけたいのincludeします。

両テーブルで扱うデータを扱えるようにする
-

```rb:models/user_donation.rb
class UserDonation
  include ActiveModel::Model
  attr_accessor :name, :name_reading, :nickname, :postal_code, :prefecture, :city, :house_number, :building_name, :price
end
```

各モデルに散在するバリデーションを集める
-

```rb:models/user_donation.rb
class UserDonation

  include ActiveModel::Model
  attr_accessor :name, :name_reading, :nickname, :postal_code, :prefecture, :city, :house_number, :building_name, :price

  with_options presence: true do
    validates :name, format: { with: /\A[ぁ-んァ-ヶ一-龥々ー]+\z/, message: "is invalid. Input full-width characters." }
    validates :name_reading, format: { with: /\A[ァ-ヶー]+\z/, message: "is invalid. Input full-width katakana characters." }
    validates :nickname, format: { with: /\A[a-z0-9]+\z/i, message: "is invalid. Input half-width characters." }
    # 「住所」の郵便番号に関するバリデーション
    validates :postal_code, format: { with: /\A[0-9]{3}-[0-9]{4}\z/, message: "is invalid. Include hyphen(-)" }
    # 「寄付金」に関するバリデーション
    validates :price, numericality: { only_integer: true, message: "is invalid. Input half-width characters." }
  end
  # 「住所」の都道府県に関するバリデーション
  validates :prefecture, numericality: { other_than: 0, message: "can't be blank" }
  # 「寄付金」の金額範囲に関するバリデーション
  validates :price, numericality: { greater_than_or_equal_to: 1, less_than_or_equal_to: 1000000, message: "is out of setting range" }
end
```

|numericality|バリデーションの種類の1つで、数値かどうかを検証するものです。またオプションで制約を加えることができ、「only_integer: true」を使うと「整数のみ」という制限を加えることができます。|
|--|--|



データをテーブルに保存する処理を書く
-

```rb:app/models/user_donation.rb
class UserDonation

  include ActiveModel::Model
  attr_accessor :name, :name_reading, :nickname, :postal_code, :prefecture, :city, :house_number, :building_name, :price

  with_options presence: true do
    validates :name, format: { with: /\A[ぁ-んァ-ヶ一-龥々ー]+\z/, message: "is invalid. Input full-width characters." }
    validates :name_reading, format: { with: /\A[ァ-ヶー]+\z/, message: "is invalid. Input full-width katakana characters." }
    validates :nickname, format: { with: /\A[a-z0-9]+\z/i, message: "is invalid. Input half-width characters." }
    validates :postal_code, format: { with: /\A[0-9]{3}-[0-9]{4}\z/, message: "is invalid. Include hyphen(-)" }
    validates :price, numericality: { only_integer: true, message: "is invalid. Input half-width characters." }
  end
  validates :prefecture, numericality: { other_than: 0, message: "can't be blank" }
  validates :price, numericality: { greater_than_or_equal_to: 1, less_than_or_equal_to: 1000000, message: "is out of setting range" }

  def save
    # ユーザーの情報を保存し、「user」という変数に入れている
    user = User.create(name: name, name_reading: name_reading, nickname: nickname)
    # 住所の情報を保存
    Address.create(postal_code: postal_code, prefecture: prefecture, city: city, house_number: house_number, building_name: building_name,user_id: user.id)
    # 寄付金の情報を保存
    Donation.create(price: price, user_id: user.id)
  end
end
```

*直前の記述で「user = User.create〜」とすることで「user」という変数を作り、そのユーザーのidを取得するために「user.id」と記述しています。

コントローラーを調査
-

```rb:app/controllers/donations_controller.rb
class  DonationsController < ApplicationController
 def index
 end

 def new
   @user_donation = UserDonation.new   #「UserDonation」に編集
 end

 def create
   @user_donation = UserDonation.new(donation_params)   #「UserDonation」に編集
    if @user_donation.valid?
      @user_donation.save
      redirect_to action: :index
    else
      render action: :new
    end
 end

 private
  # 全てのストロングパラメーターを1つに統合
 def donation_params
  params.require(:user_donation).permit(:name, :name_reading, :nickname, :postal_code, :prefecture, :city, :house_number, :building_name, :price)
 end

end
```