@tomo1030 (tomo1030)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Rails deviseを用いた新規登録について

解決したいこと

Rails5にてdeviseを用いてユーザー登録を作成中の初学者です。
新規登録をする際にcollection_check_boxesにて複数の項目を選択し、保存しようしています。

保存したい情報(area、part、genre)にはactive_hashを使用しており、選択した各項目がUserテーブルの各カラム(area、part、genre)に配列で格納されるよう作成しています。

問題として、先に実装したareaに関しては期待通りに動きましたが、後から実装したpart、genreでは以下のエラーが出ております。

実装したい仕組みは同じため、areaで記述した内容を置き換えるという認識だったので、エラーが出る理由に悩んでいます。

発生している問題・エラー

スクリーンショット 2020-10-13 16.36.49.png

#ターミナルでの出力、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'が何を指しているのか分からず、対応に詰まっております。
お手数をおかけしますが、対応方法について御助力いただきたく存じます。
見落としや解消のための観点などご指摘頂いただけると幸いです。

0 likes

1Answer

本件、自己解決いたしました。
active_hashを使用するために作成したmodelのファイル名を、Userテーブルのカラム名と同名にしていたことが原因でした。これにより、view上でカラム名として認識されていたようです...。
対応としては、
part.rb → user_part.rb
genre.rb → user_genre.rb
と変更することで正常に機能することを確認しました。
基本的な知識不足、痛感いたしました。

0Like

Your answer might help someone💌