質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

991閲覧

Userの住所カラムの保存ができず困っております。アドバイスを頂けたらありがたいです。 rails学習でECサイトの作成に取り組んでいる初心者です。

covalt

総合スコア2

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/06/12 11:56

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

アドバイス頂けましたら幸いです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

winterboum

2020/06/12 12:16

都道府県はnameで保存するのでしょうか、codeで保存するのでしょうか
guest

回答1

0

ベストアンサー

ああ、codeでしまうのですね、では

f.input :prefecture_code, collection: のところですが
value_method => :name, ではなく
:label_method => :name,:value_method => :code,
ですね

投稿2020/06/12 12:22

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

covalt

2020/06/12 13:55

早速のご回答ありがとうございます! お教えいただいたように変えてみたのですが、エラー内容は同じままでした。formの部分以外にも原因があるでしょうか。 他の部分も含めて修正試してみたいと思います。何か解決のヒントがありましたら引き続きよろしくお願いします。 ありがとうございました。
covalt

2020/06/13 02:39

お教えいただいた内容に加えて、ストロングパラメータに「prefecture_code」が入っていませんでしたので、こちらを加えることで正しく保存でき、「prefecture_name」で都道府県も取得できようになりました!自分一人で考えていたら辿りつかなかった部分にお答え頂いて本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問