Rails deviseを用いた新規登録について
Q&A
Closed
解決したいこと
Rails5にてdeviseを用いてユーザー登録を作成中の初学者です。
新規登録をする際にcollection_check_boxesにて複数の項目を選択し、保存しようしています。
保存したい情報(area、part、genre)にはactive_hashを使用しており、選択した各項目がUserテーブルの各カラム(area、part、genre)に配列で格納されるよう作成しています。
問題として、先に実装したareaに関しては期待通りに動きましたが、後から実装したpart、genreでは以下のエラーが出ております。
実装したい仕組みは同じため、areaで記述した内容を置き換えるという認識だったので、エラーが出る理由に悩んでいます。
発生している問題・エラー
#ターミナルでの出力、ganreでも同様です。
ActionView::Template::Error (undefined method `part_id' for #<User:0x00007fd3fe56a048>
Did you mean? part):
57: <div class="field">
58: <%= f.label :part, "担当パート" %><br>
59: <%= f.collection_check_boxes :part, Part.all, :id, :name do |part| %>
60: <%= part.label {part.check_box + part.text} %>
61: <% end %>
62: </div>
63: </td>
該当するソースコード
new.hetml.erb
<h2>新規ユーザー登録</h2>
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= render "users/shared/error_messages", resource: resource %>
<table class="table">
<thead></thead>
<tbody>
<tr>
<td>
<div class="field">
<%= f.label :name, "ニックネーム" %><br />
<%= f.text_field :name, autofocus: true, autocomplete: "name" %>
</div>
</td>
</tr>
<tr>
<td>
<div class="field">
<%= f.label :email, "メールアドレス" %><br />
<%= f.email_field :email, autocomplete: "email" %>
</div>
</td>
</tr>
<tr>
<td>
<div class="field"><!-- ここの項目は問題なく動作しました -->
<%= f.label :area, "活動地域" %><br>
<%= f.collection_check_boxes :area, Prefecture.all, :id, :name do |area| %>
<%= area %>
<%= area.label {area.check_box + area.text} %>
<% end %>
</div>
</td>
</tr>
<tr>
<td>
<div class="field"><!-- ここの項目でエラー出力あり -->
<%= f.label :part, "担当パート" %><br>
<%= f.collection_check_boxes :part, Part.all, :id, :name do |part| %>
<%= part.label {part.check_box + part.text} %>
<% end %>
</div>
</td>
</tr>
<tr>
<td>
<div class="field"><!-- ここの項目でエラー出力あり -->
<%= f.label :genre, "好きなジャンル" %><br>
<%= f.collection_check_boxes :genre, Genre.all, :id, :name do |genre| %>
<%= genre.label {genre.check_box + genre.text} %>
<% end %>
</div>
</td>
</tr>
<tr>
<td>
<div class="field">
<%= f.label :password, "パスワード" %>
<% if @minimum_password_length %>
<em>(<%= @minimum_password_length %> 文字以上)</em>
<% end %><br />
<%= f.password_field :password, autocomplete: "new-password" %>
</div>
</td>
</tr>
<tr>
<td>
<div class="field">
<%= f.label :password_confirmation, "パスワード(確認用)" %><br />
<%= f.password_field :password_confirmation, autocomplete: "new-password" %>
</div>
</td>
</tr>
</tbody>
</table>
<div class="actions">
<%= f.submit "新規登録" %>
</div>
<% end %>
<h4><mark style="background-color: #F8F8F8F8;">既に登録済みの方</mark></h4>
<%= link_to "こちら", new_session_path(resource_name) %>からログインしてください。
prefectyre.rb (都道府県の情報)
class Prefecture < ActiveHash::Base
self.data = [
{id: 1, name: '北海道'}, {id: 2, name: '青森県'}, {id: 3, name: '岩手県'},
{id: 4, name: '宮城県'}, {id: 5, name: '秋田県'}, {id: 6, name: '山形県'},
{id: 7, name: '福島県'}, {id: 8, name: '茨城県'}, {id: 9, name: '栃木県'},
{id: 10, name: '群馬県'}, {id: 11, name: '埼玉県'}, {id: 12, name: '千葉県'},
{id: 13, name: '東京都'}, {id: 14, name: '神奈川県'}, {id: 15, name: '新潟県'},
{id: 16, name: '富山県'}, {id: 17, name: '石川県'}, {id: 18, name: '福井県'},
{id: 19, name: '山梨県'}, {id: 20, name: '長野県'}, {id: 21, name: '岐阜県'},
{id: 22, name: '静岡県'}, {id: 23, name: '愛知県'}, {id: 24, name: '三重県'},
{id: 25, name: '滋賀県'}, {id: 26, name: '京都府'}, {id: 27, name: '大阪府'},
{id: 28, name: '兵庫県'}, {id: 29, name: '奈良県'}, {id: 30, name: '和歌山県'},
{id: 31, name: '鳥取県'}, {id: 32, name: '島根県'}, {id: 33, name: '岡山県'},
{id: 34, name: '広島県'}, {id: 35, name: '山口県'}, {id: 36, name: '徳島県'},
{id: 37, name: '香川県'}, {id: 38, name: '愛媛県'}, {id: 39, name: '高知県'},
{id: 40, name: '福岡県'}, {id: 41, name: '佐賀県'}, {id: 42, name: '長崎県'},
{id: 43, name: '熊本県'}, {id: 44, name: '大分県'}, {id: 45, name: '宮崎県'},
{id: 46, name: '鹿児島県'}, {id: 47, name: '沖縄県'}
]
include ActiveHash::Associations
has_many :users
end
part.rb (パートの情報)
class Part < ActiveHash::Base
self.data = [
{id: 1, name: 'ボーカル'},
{id: 2, name: 'ギター'},
{id: 3, name: 'ベース'},
{id: 4, name: 'ピアノ・キーボード'},
{id: 5, name: 'ドラム'},
{id: 6, name: 'パーカッション'},
{id: 7, name: '管楽器'},
{id: 8, name: '弦楽器'},
{id: 9, name: '作詞・作曲・編曲'},
{id: 10, name: 'DJ'},
{id: 11, name: 'ダンサー・パフォーマー'},
{id: 12, name: 'その他'},
]
include ActiveHash::Associations
has_many :users
end
genre.rb (ジャンルの情報)
class Genre < ActiveHash::Base
self.data = [
{id: 1, name: 'ジャズ'},
{id: 2, name: 'ブルース'},
{id: 3, name: 'ロック'},
{id: 4, name: 'ハードロック'},
{id: 5, name: 'フュージョン'},
{id: 6, name: 'パンク/メロコア'},
{id: 7, name: 'ファンク'},
{id: 8, name: 'ソウル/R&B'},
{id: 9, name: 'ハウス/テクノ'},
{id: 10, name: 'カントリー/フォーク'},
{id: 11, name: 'メタル'},
{id: 12, name: 'スカ'},
{id: 13, name: 'ロカビリー'},
{id: 14, name: 'ボサノバ/ラテン'},
{id: 15, name: 'ヒップホップ/レゲエ'},
{id: 16, name: 'クラシック'},
{id: 17, name: 'ゴスペル/アカペラ'},
{id: 18, name: 'その他'},
]
include ActiveHash::Associations
has_many :users
end
user.rb
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
has_many :recruit
extend ActiveHash::Associations::ActiveRecordExtensions
belongs_to_active_hash :prefecture
belongs_to_active_hash :part
belongs_to_active_hash :genre
end
NoMethodErrorということから、ケアレスミスなどが無いか、active_hashやcollection_check_boxesの記述に変な箇所はないか確認しましたが発見できず...
エラーのundefined method `part_id'が何を指しているのか分からず、対応に詰まっております。
お手数をおかけしますが、対応方法について御助力いただきたく存じます。
見落としや解消のための観点などご指摘頂いただけると幸いです。