Userの住所カラムの保存ができず困っております。アドバイスを頂けたらありがたいです。
rails学習でECサイトの作成に取り組んでいる初心者です。
deviseでUserを作成して、jp_prefectureuserでテーブルに住所のカラムを持たせようと参考記事を真似してコードを書きましたが、保存がうまくできない状況です。
解決のアドバイスなど頂けましたらありがたいです。
##環境
・ruby 2.5.1
・rails 5.2.1
・cloud9
・sqlite3 1.3.13
・devise
・simple_form
・jp_prefecture
発生している問題・エラーメッセージ
Userの新規登録画面で、各項目を入力後に下記エラーとなりました。
「prefecture_code」がnullとなっていることでエラーがでているのかと推測しております。
(Userモデルの該当カラムには「null: false」を入れてます。)
error
1ActiveRecord::NotNullViolation in Devise::RegistrationsController#create 2SQLite3::ConstraintException: users.prefecture_code may not be NULL: INSERT INTO "users" ("email", "encrypted_password", "name", "phone_number", "birth_date", "postcode", "address_city", "address_street", "address_building", "confirmation_token", "confirmation_sent_at", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
▼app/views/users/registrations/new.html.erb
<h2>Sign up</h2> <%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %> <%= f.error_notification %> <div class="form-inputs"> <%= f.input :name, required: true, autofocus: true, input_html: { autoomplete: "name" } %> <%= f.input :email, required: true, autofocus: true, input_html: { autocomplete: "email" } %> <%= f.input :phone_number, required: true, input_html: { autocomplete: "phone_number" } %> <%= f.input :birth_date, use_month_number: true, start_year: 1930, end_year: (Time.now.year - 10), default: Date.new(1980, 1, 1), required: true %> <%= f.input :postcode %> <%= f.input :prefecture_code, collection: JpPrefecture::Prefecture.all, :value_method => :name, include_blank: '都道府県' %> <%= f.input :address_city %> <%= f.input :address_street %> <%= f.input :address_building %> <%= f.input :password, required: true, hint: ("#{@minimum_password_length} characters minimum" if @minimum_password_length), input_html: { autocomplete: "new-password" } %> <%= f.input :password_confirmation, required: true, input_html: { autocomplete: "new-password" } %> </div> <div class="form-actions"> <%= f.button :submit, "Sign up" %> </div> <% end %> <%= render "users/shared/links" %>
▼app/models/user.rb
class User < ApplicationRecord -省略- include JpPrefecture jp_prefecture :prefecture_code def prefecture_name JpPrefecture::Prefecture.find(code: prefecture_code).try(:name) end def prefecture_name=(prefecture_name) self.prefecture_code = JpPrefecture::Prefecture.find(name: prefecture_name).code end end
▼app/controllers/application_controller.rb
class ApplicationController < ActionController::Base before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [ :name, :phone_number, :birth_date, :postcode, :prefecture_name, :address_city, :address_street, :address_building ]) devise_parameter_sanitizer.permit(:account_update, keys: [ :name, :phone_number, :birth_date, :postcode, :prefecture_name, :address_city, :address_street, :address_building ]) end end
試したこと
ストロングパラメータの「:prefecture_name」を「:prefecture_code」に変更すると保存はできますが、prefecture_codeには「0」が入ってしまい、正しく動作していないと思われます。このあたりが上手く機能していないと思うのですが、どのように修正をすればいいのか分かりかねています。
pry(main)> user = User.find 2 User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 2], ["LIMIT", 1]] => #<User id: 2, email: "test@gmail.com", name: "test", phone_number: "08012345678", birth_date: "1980-01-01", postcode: 1600021, prefecture_code: 0, address_city: "新宿区", address_street: "歌舞伎町", address_building: "", created_at: "2020-06-12 11:34:01", updated_at: "2020-06-12 11:34:12"> pry(main)> user.prefecture_code => 0 pry(main)> user.prefecture_name => nil
アドバイス頂けましたら幸いです。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー