今週の内容
・商品出品機能の導入
・商品出品ページの表示とデータの保存
MVCの流れを作る
ルーティング設定
コントローラーにアクションを追加
ビューの作成
実装後ルーティングエラーが発生
ルーティングエラーの場合、ルーティングが間違っているか、ビューにルーティングが送られていないことが原因である
今回はビューでミスがあった
form_with についてもっと勉強が必要
修正後カテゴライズされたデータのみ保存されないエラーが発生
コントローラーとビューは問題なかったが
バリデーションに問題があった
class Item < ApplicationRecord
has_one_attached :image
belongs_to :user
with_options presence: true do
validates :image
validates :name
validates :explanation
validates :price
with_options numericality: { other_than: 1, message: "Select" } do
validates :category
validates :deliver_fee
validates :shipping_area
validates :shipping_day
validates :status
end
end
extend ActiveHash::Associations::ActiveRecordExtensions
belongs_to :category
belongs_to :deliver_fee
belongs_to :shipping_area
belongs_to :shipping_day
belongs_to :status
end
アソシエーションとバリデーションの違いが理解できていなかった
アソシエーションはモデルにつけるものなのでidがいらない
バリデーションはカラムにつけるものなのでcategory_idなどのようになる
またアソシエーションにはpresence trueは自動で実装されるためいらない
修正すると
class Item < ApplicationRecord
has_one_attached :image
belongs_to :user
with_options presence: true do
validates :image
validates :name
validates :explanation
validates :price
end
with_options numericality: { other_than: 1, message: "Select" } do
validates :category_id
validates :deliver_fee_id
validates :shipping_area_id
validates :shipping_day_id
validates :status_id
end
extend ActiveHash::Associations::ActiveRecordExtensions
belongs_to :category
belongs_to :deliver_fee
belongs_to :shipping_area
belongs_to :shipping_day
belongs_to :status
end
このようになる
・単体テストコードの実装
factory.botでのuserをどうするか悩み過去カリキュラムに戻った
・javascriptで金額入力時に販売手数料や販売利益の計算結果が表示されるようにする
表示がNaNとなってしまうエラーが発生
その時のコードが
エラー
window.addEventListener('load', () => {
// 金額を入力した数値をpriceInputという変数に格納する
const priceInput = document.getElementById("item-price");
priceInput.addEventListener("input", () => {
const inputValue = priceInput.value;
const addTaxDom = document.getElementById("add-tax-price");
addTaxDom.innerHTML = Math.floor ( inputValue * 0.1 )
const profitDom = document.getElementById("profit");
profitDom.innerHTML = Math.floor ( inputValue - addTaxDom )
})
});
定義したaddTaxDomという値がエラーを起こしていた
解決方法が2種類あり
1つ目がaddTaxDomを計算では使わない方法
window.addEventListener('load', () => {
// 金額を入力した数値をpriceInputという変数に格納する
const priceInput = document.getElementById("item-price");
priceInput.addEventListener("input", () => {
const inputValue = priceInput.value;
const addTaxDom = document.getElementById("add-tax-price");
addTaxDom.innerHTML = Math.floor ( inputValue * 0.1 )
const profitDom = document.getElementById("profit");
profitDom.innerHTML = Math.floor ( inputValue * 0.9 )
})
});
2つ目が addTaxDomを変数として定義し直す方法
window.addEventListener('load', () => {
// 金額を入力した数値をpriceInputという変数に格納する
const priceInput = document.getElementById("item-price");
priceInput.addEventListener("input", () => {
const inputValue = priceInput.value;
const addTaxDom = document.getElementById("add-tax-price");
addTaxDom.innerHTML = Math.floor ( inputValue * 0.1 )
const tax = Math.floor ( inputValue * 0.1 );
const profitDom = document.getElementById("profit");
profitDom.innerHTML = Math.floor ( inputValue - tax )
})
});
結果として2つ目の方法の方がより良いらしい
理由は掛け算だと四捨五入が発生してしまうため、数値によっては一円の誤差が出てしまうからである
コードレビューをしてもらい、いくつか細かいところを修正してLGTMをもらった
感想
似たようなエラーが起き、前の記録をみたいことが多くあった
今後タグや強調表示を上手く使いながら
似たエラーの時すぐに調べられるようにしたい