索引
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
回答1件
あなたの回答
tips
プレビュー