1
3

More than 3 years have passed since last update.

Active Hashの落とし穴

Posted at

概要

今回、Active Hashに格納したデータを商品編集で呼び出す際に落とし穴にハマってしまったので共有しておきます。

qiita内を色々と検索かけてみましたが、なかなか解決せず、沼ってしまいました、、、

実装内容

一度あらゆるデータを登録して出品したitemに、editアクションで編集する機能を実装します。

ポイントは、編集画面に遷移したら元々登録してあったデータがリセットされずに登録されていることです。

うまくビューファイルの呼び出し記述やモデルのアソシエーションの結びつけをできていれば問題ないのですが、しっかりエラーしまくりました。

解決方法

先に解決方法から言っておきます。

今回のような機能を実装する場合、Active Hashにあるデータのカラム名は
xxx_id
としましょう。

例えばカテゴリーや配送元の都道府県などは固定のデータなのでActive Hashに記述します。ここで、itemのカラムと紐づける場合、しっかりとcategory_idやprefecture_idとしましょう。

逆にモデルでアソシエーションを組む際は、
belongs_to_active_hash :categoryのようになり、_idは記述しないで大丈夫です。

以下、コードをまとめておくのでそちらで理解していただければ幸いです。

コード

models/item.rb
---省略---
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
---省略---
views/edit.html.erb
<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がついているところです。

○○_create_items.rb

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がつかなきゃいけないことに気づかずに沼っていました。
コンソールとかをいじればこの理論がよくわかると思いますが、同じ初心者でエラー解決がまだ不得意で困っている方の助けになれば幸いです。

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