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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

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

Ruby

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

Q&A

解決済

1回答

3660閲覧

サインイン機能でsaveができない

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 5

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

Ruby

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

0グッド

1クリップ

投稿2019/05/20 10:35

編集2019/05/21 12:46

索引
0、使っている環境
1、目的
2、問題点
3、提供できるデータ
上記索引順に記述しています。

0、使っている環境
Rails 5.2.3
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin17]

1,目的
サインイン機能を実装し、Viewの方からその操作が滞りなく進むこと。

2,問題点
Userコントローラでcreateアクションを実行する際に、データベースの中身でnulのものがあるらしく、サインインができない。
なぜcreateアクションに問題があるかは下記の内容で調べたと考えています。ご参照ください。
エラーコードは、

rails

1Unknown column 'users.password' in 'where clause': SELECT 1 AS one FROM `users` WHERE `users`.`password` IS NULL LIMIT 1

でした。

3,提供でき、これがあれば理解していただけるのではないか?と考えられるデータ
migrationファイル、modelのファイル、controllerのファイル、viewのファイル。rails consoleで確認したこと。
※他に必要であれば何でも言ってください、提供できるデータはすべて提供します。
また、自分で解決を図り、試したことでわかったことについても記述します。
お時間あればご回答いただけると幸いです。よろしくお願いします。

3-1,省略/migrate/省略_create_users.rb(maigrationファイル)

ruby

1class CreateUsers < ActiveRecord::Migration[5.2] 2 def change 3 create_table :users do |t| 4 t.string :name 5 t.string :email 6 7 8 t.timestamps 9 end 10 end 11end

3-2,省略/models/user.rb(modelファイル)

ruby

1class User < ApplicationRecord 2 VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i 3 validates :name, presence: true ,length: {maximum:20},uniqueness: true 4 validates :email, presence: true, uniqueness: true,format: { with: VALID_EMAIL_REGEX } 5 6 #パスワード用のバリデーション・正規表現 7 #PASS_WORD_REGEX = /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]{5,100}+\z/i 8 has_secure_password 9 validates :password, presence:true, uniqueness:true, length: {maximum:72}#,format: {with:PASS_WORD_REGEX} 10end

3-3,app/asset/controllers/users_controller.rb(controllerファイル)

Ruby

1class UsersController < ApplicationController 2 def new 3 @user = User.new 4 end 5 6 def create 7 @user = User.new(user_params) 8 if @user.save 9 redirect_to root_path 10 flash[:success] = "登録に成功しました" 11 else 12 flash[:danger] = "登録に失敗しました。登録した情報に空欄があるか、またはすでに使用され重複している可能性があります" 13 render :new 14 end 15 end 16 17 #privateメソッドでこのコントローラ内部でのみ動くクラスを定義した。ストロングパラメータを定義。 18 private 19 def user_params 20 params.require(:user).permit(:name, :email, :password_digest) 21 end 22end

ここのcreateアクションで問題発生。

3-4,app/asset/views/users/new.html.erb(viewファイル)

ruby

1<div class="users-new-wrapper"> 2 <div class="container"> 3 <div class="row"> 4 <div class="col-md-offset-4 col-md-4 users-new-container"> 5 <h1 class="text-center text-white">Sign up</h1> 6 <%= form_for @user do |f| %> 7 <div class="form-group"> 8 <%= f.label :name, class: 'text-white' %> 9 <%= f.text_field :name, class: 'form-control' %> 10 </div> 11 <div class="form-group"> 12 <%= f.label :email, class: 'text-white' %> 13 <%= f.text_field :email, class: 'form-control' %> 14 </div> 15 <div class="form-group"> 16 <%= f.label :password, class: 'text-white' %> 17 <%= f.text_field :password, class: 'form-control' %> 18 </div> 19 <div class="form-group"> 20 <%= f.label :password_confirmation, class: 'text-white' %> 21 <%= f.text_field :password_digest, class: 'form-control' %> 22 </div> 23 24 <%= f.submit "登録", class: 'btn-block btn-white' %> 25 <% end %> 26 <%= link_to 'ログインはこちら', login_path,class: 'text-white' %> 27 </div> 28 </div> 29 </div> 30</div> 31

4,試したことおよびrails consoleよりわかったこと

4-1,Userテーブルがどうなっているのか確認。

rails

1[1] pry(main)> User.column_names 2 (0.4ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483 3=> ["id", "name", "email", "created_at", "updated_at", "password_digest"]

4-2,Userコントローラで何ができないのかの確認。まずは、User.newから。

rails

1[2] pry(main)> user1 = User.new(name:'asdf',email:'test1@test.com',password_digest:'asdfghjkl') 2 3=> #<User:0x007fc7f152c310 4 id: nil, 5 name: "asdf", 6 email: "test1@test.com", 7 created_at: nil, 8 updated_at: nil, 9 password_digest: "asdfghjkl">

→なぜかidに番号が入らないのを不思議だと感じながらも、一応はできている?みたい。
なので、それぞれのカラムに適当なものを打ち込んで、saveができるかを以下で確認する。

4-3,user1.saveを試してみる。

rails

1[3] pry(main)> user1.save 2 (0.2ms) BEGIN 3 User Exists (0.3ms) SELECT 1 AS one FROM `users` WHERE `users`.`name` = BINARY 'asdf' LIMIT 1 4 User Exists (0.3ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY 'test1@test.com' LIMIT 1 5 User Exists (1.4ms) SELECT 1 AS one FROM `users` WHERE `users`.`password` IS NULL LIMIT 1 6 (0.2ms) ROLLBACK 7ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'users.password' in 'where clause': SELECT 1 AS one FROM `users` WHERE `users`.`password` IS NULL LIMIT 1 8from /Users/horiguchihiroki/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/mysql2-0.5.2/lib/mysql2/client.rb:131:in `_query' 9Caused by Mysql2::Error: Unknown column 'users.password' in 'where clause' 10from /Users/horiguchihiroki/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/mysql2-0.5.2/lib/mysql2/client.rb:131:in `_query'

→なぜか存在しているかのような返答をもらえたので、どういうこと?と確認の意味で、find_byで探してみる。

4-4,User.find_by(name:'asdf')で、確認。

rails

1[4] pry(main)> user2 = User.find_by(name:'asdf') 2 User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`name` = 'asdf' LIMIT 1 3=> nil

→いやないじゃん。User.saveができていないらしいということがここで確認できたと考えています。ここからの打開策を自分では計っているのですが、なかなか解決できないのでそもそもの着眼点自体が異なるのではないか?ということでこちらで質問をさせていただきます、よろしくお願いします。

(後日編集箇所)ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
tktktさんありがとうございます!以下にpassword_digestをaddしているファイルの中身を記載します。
これで、password_digestは設定できていると考えているのですが、この認識はあっていますでしょうか?

rails

1class AddPasswordDigestToUsers < ActiveRecord::Migration[5.2] 2 def change 3 add_column :users, :password_digest, :string 4 end 5end

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

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

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

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

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

urbainleverrier

2019/05/20 14:18

migrationファイルでpassword_digestがありませんが、他のファイルで設定されていますか? エラーの内容はpasswordカラムがないということです。 おそらく、以下のあたりでエラーが起きているんだと思います。 ``` validates :password, presence:true, uniqueness:true, length: {maximum:72} ``` エラーの最後、`IS NULL`とは、user.passwordがnullということで、本当はuser.password_digestに値が入っているのではないですか? user.idに値が入らないのは、mysqlのincrement機能の恩恵をまだ得ていないからです。saveすれば入ります。
退会済みユーザー

退会済みユーザー

2019/05/21 12:51 編集

tktktさん、ご回答ありがとうございます! password_digestに関しては、編集で載せたコードから設定できていると認識しております。 指摘いただいているエラー部分に関しては、passwordカラムではなく、password_digestカラムにバリデーションをかけるべきということですよね。試してみます! ご指摘本当にありがとうございました。バリデーションをかける部分を間違っておりました。正常に、ユーザ登録することができました、本当にありがとうござました。
guest

回答1

0

ベストアンサー

とりあえず解決しました、バリデーションをかける部分にミスがあったようでした。

投稿2019/05/21 14:28

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問