##概要
今回、Active Hashに格納したデータを商品編集で呼び出す際に落とし穴にハマってしまったので共有しておきます。
qiita内を色々と検索かけてみましたが、なかなか解決せず、沼ってしまいました、、、
##実装内容
一度あらゆるデータを登録して出品したitemに、editアクションで編集する機能を実装します。
ポイントは、編集画面に遷移したら元々登録してあったデータがリセットされずに登録されていることです。
うまくビューファイルの呼び出し記述やモデルのアソシエーションの結びつけをできていれば問題ないのですが、しっかりエラーしまくりました。
##解決方法
先に解決方法から言っておきます。
今回のような機能を実装する場合、Active Hashにあるデータのカラム名は
xxx_id
としましょう。
例えばカテゴリーや配送元の都道府県などは固定のデータなのでActive Hashに記述します。ここで、itemのカラムと紐づける場合、しっかりとcategory_idやprefecture_idとしましょう。
逆にモデルでアソシエーションを組む際は、
belongs_to_active_hash :categoryのようになり、_idは記述しないで大丈夫です。
以下、コードをまとめておくのでそちらで理解していただければ幸いです。
##コード
---省略---
extend ActiveHash::Associations::ActiveRecordExtensions
belongs_to_active_hash :category
belongs_to_active_hash :condition
belongs_to_active_hash :postage_type
belongs_to_active_hash :prefecture
belongs_to_active_hash :preparation_days
---省略---
<div class="items-detail">
<div class="weight-bold-text">商品の詳細</div>
<div class="form">
<div class="weight-bold-text">
カテゴリー
<span class="indispensable">必須</span>
</div>
<%= f.collection_select(:category_id, Category.all, :id, :name, {}, {class:"select-box", id:"item-category"}) %>
<div class="weight-bold-text">
商品の状態
<span class="indispensable">必須</span>
</div>
<%= f.collection_select(:condition_id, Condition.all, :id, :name, {}, {class:"select-box", id:"item-sales-status"}) %>
</div>
</div>
マイグレーションファイルは以下のようになっています。
注目して欲しいのは、カラム名に_idがついているところです。
class CreateItems < ActiveRecord::Migration[6.0]
def change
create_table :products do |t|
t.string :name, null: false
t.text :explanation, null: false
t.integer :category_id, null: false
t.integer :condition_id, null:false
t.integer :postage_type_id, null:false
t.integer :prefecture_id, null:false
t.integer :preparation_days_id, null:false
t.integer :value, null:false
t.references :user, foreign_key: true
t.timestamps
end
end
end
##最後に
僕はカラム名に_idがつかなきゃいけないことに気づかずに沼っていました。
コンソールとかをいじればこの理論がよくわかると思いますが、同じ初心者でエラー解決がまだ不得意で困っている方の助けになれば幸いです。