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

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

ただいまの
回答率

89.88%

devise機能を導入してログイン・新規作成時のエラー

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 46

yume0409

score 5

Ruby on Rails でdeviseを導入しました。
新規作成とログインを試すとエラーが出ます。
まだ始めたばっかりでよく分からないのですが、deviseを導入して、ログインや新規作成を出来るように
するには他に何か作業がいるのでしょうか?
エラー内容は
新規作成

ActiveRecord::NotNullViolation in Devise::RegistrationsController#create


ログイン

BCrypt::Errors::InvalidHash in Devise::SessionsController#create


です。
devise導入後、nameフィールドが必要でしたので追加しました(DBにもカラム追加しました)

- if user_signed_in?
  = link_to "ログアウト", destroy_user_session_path, method: :delete, class: "aaa"
- else
  = link_to "ログイン", user_session_path, class: "sign_in"
  = link_to "新規登録", new_user_registration_path, class: "sign_up"


これでログインしてる場合はビューはログアウトボタンに変更すると言う記述も完了しました。
ちなみに新規作成が出来ないのでログインするメールやパスワードはDB(SQLPro)に手入力して1つ保存されています。

ご回答よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • winterboum

    2020/01/16 17:01

    エラーメッセージは全文載せてください。必要な情報があります

    キャンセル

回答 1

checkベストアンサー

0

新規作成の ActiveRecord::NotNullViolation ですが、これは
「DB制約上、NULL にしてはいけない項目が NULL のまま保存が実行された」
ことによるエラーです。

おそらく、新たに追加された name フィールドに NOT NULL 制約を付けておられるんですよね?

対応方法ですが、まずは name フィールドを画面に追加します。

.field
  = f.label :name
  br
  = f.text_field :name

しかし、セキュリティの都合上、デフォルトだと email や password などの情報しか受け取らないようになっています。
そこで、「name は安全なやつだよ」ということを devise に教えてあげなければいけません。

具体的には、 ApplicationController に以下のコードを追加すればOKです。

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])
  end
end

--

ログインの方ですが、手動でデータを作ったことが原因です。

おそらく、DBのパスワードカラムに直接 "password1" のような値を入力されてますよね?

これもセキュリティの都合なのですが、ユーザーが新規登録画面から "password1" のようなパスワードを入力した場合、DBには "gfasfajoasdijdoagia1238nj8asf" みたいに「ハッシュ化」した値が保存されるようになってます。
こうすることで、万が一、悪いハッカーが DB の中身を覗き見たとしても、パスワードがバレない仕組みになっています。
なので、手動でデータを登録する場合もハッシュ化したパスワードをDBに入れないといけないんですが・・・正直めんどくさいですよね?

そこで、「Rails に普通のパスワードを渡して、Rails経由でデータを作る」という方法を取ります。

まずは db/seeds.rb に、ユーザー登録のためのコードを記述します。

# 既存のユーザーを全削除
User.delete_all

# ユーザーを登録
User.create!(name: "shinoharat", password: "password1", email: "aaa@example.com")

書き終わったら、以下のコマンドで seeds.rb を実行します。

rails db:seed

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/16 17:52

    ご丁寧にありがとうございます!
    無事、ログインできました!
    db/seeds.rbは手動でアカウント作る場合のみに記述したらいいのでしょうか?
    手動でやらない場合は記述しなくても大丈夫でしょうか?

    キャンセル

  • 2020/01/17 12:05

    開発用(あるいは本番用)に何かしらのデータを作りたい場合のみに記述します。
    とくにそういうデータが要らないなら書く必要はありません。

    キャンセル

  • 2020/01/17 13:38

    それと、 winterboum さんも指摘されていますが、エラーの情報はもう少し詳しく書いてあると嬉しいです。
    今回は、私がたまたま過去に似た現象を見たことがあったので回答を書くことができましたが、そうでなければ質問文から原因を特定することは困難だったと思います。

    コンソールにエラーログが色々出ていると思いますので、それを全部まとめてコピペで貼っちゃってOKです。

    次回からでいいので、よろしくお願いします🙏

    キャンセル

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

  • ただいまの回答率 89.88%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る