フィールドを持つテーブルがあります: email
、password_hash
およびsalt
。
ユーザー登録時に、パスワードの有効化とパスワードの確認を行いたいのですがcan't be blank
、パスワードの入力に対して常にエラーが発生します。
これは私のモデルです:
attr_accessor :password
validates :password, :presence => true,
:confirmation => true,
:length => { :within => 6..40 }
データベースではないフィールドを検証できませんが、ユーザーが入力したパスワードを検証するにはどうすればよいですか?
password
取得した入力を暗号化してからdbフィールドに保存するため、データベースにパスワードフィールドがありませんpassword_hash
。
編集 :
これはデータベーステーブルです:
class CreateStudents < ActiveRecord::Migration
def change
create_table :students do |t|
t.string :first_name
t.string :last_name
t.string :email
t.string :password_hash
t.string :salt
t.boolean :activated
t.timestamps
end
end
end
これは登録用のビューです。
<%= form_for @student, url: {action: 'create'} do |form| %>
<p style="font-size:smaller; color:red">
<% @student.errors.messages.each do |att, msg| %>
<%= msg[0] %><br>
<% end %>
<p>
<%= form.label :first_name %><br>
<%= form.text_field :first_name %>
<p>
<%= form.label :last_name %><br>
<%= form.text_field :last_name %>
<p>
<%= form.label :email %><br>
<%= form.text_field :email %>
<p>
<%= form.label :password %><br>
<%= form.password_field :password %>
<p>
<%= form.label :password_confirmation %><br>
<%= form.password_field :password_confirmation %>
<p>
<%= form.submit %>
<% end %>
これはコントローラーです:
def sing_up
@student = Student.new
render 'sing_up'
end
def create
@student = Student.new
@student.first_name = params[:student][:first_name]
@student.last_name = params[:student][:last_name]
@student.email = params[:student][:email]
@student.salt = BCrypt::Engine.generate_salt
@student.password_hash = BCrypt::Engine.hash_secret(params[:student][:password], @student.salt)
if @student.save
redirect_to controller: 'singups', action: 'index'
else
render 'sing_up'
end
end
最後に、これはモデルです
class Student < ActiveRecord::Base
attr_accessor :password
validates :first_name, :length => { minimum: 3, message: "first_name" }
validates :last_name, :length => { minimum: 3, message: "last_name" }
validates :email, :presence => { message: 'email' },
:format => { with: /\A[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+\z/ , message: 'email format' },
:uniqueness => { message: 'uniqueness?' }
validates :password, :confirmation => { message: 'password' },
:length => { minimum: 6, message: 'password length' }
end
ユーザーがパスワードを入力するたびに:confirmation => { message: 'password' }
、パスワードが何であれ、最初の検証で失敗します。
一部を削除するvalidates :password
と、すべて正常に動作しますが、ユーザーが入力したパスワードは検証されません。