私は Michael Hartl のhttp://ruby.railstutorial.orgに従い、第 6.3.2 章でパスワードと確認で立ち往生しました。( http://ruby.railstutorial.org/chapters/modeling-users#sec:adding_a_secure_password )
以下の指示を読んだ後、私が理解していることから、「attr_assessor :password, :password_confirmation」を User.rb に追加しました。
「図 6.1 のモックアップに見られるように、ユーザーにパスワードを確認してもらうことを期待しています。これは、タイプミスを最小限に抑えるための Web での一般的な慣行です。これをコントローラー層で強制することもできますが、モデルに入れて使用するのが一般的です。 Active Record を使用して制約を強制します. この方法は, password 属性と password_confirmation 属性を User モデルに追加し, レコードがデータベースに保存される前に 2 つの属性が一致することを要求します. これまで見てきた他の属性とは異なり,パスワード属性は仮想的であり、メモリー内に一時的に存在するだけで、データベースには永続化されません。」
以下を追加した後、user_spec.rb の bundle exec ガードで 11 回失敗します。
password: "foobar", password_confirmation: "foobar" to @User.new in models/user_spec.rb
db:development.sqlite3 に存在しない「仮想」属性 (password、password_confirmation) のようなもの。これは私が成功せずにやろうとしていることです。user.rb で @User を使用したハッシュなど、考えられるすべての方法を試してみました
ここで何が間違っていましたか?
よろしくお願いします
file: spec/user_spec.rb
require 'spec_helper'
describe User do
before do
# @user = User.new(name: "Example User", email: "user@example.com")
@user = User.new(name: "Example User", email: "user@example.com",
password: "foobar", password_confirmation: "foobar")
end
subject { @user }
it { should respond_to(:name) }
it { should respond_to(:email) }
it { should respond_to(:password_digest) }
it { should respond_to(:password)}
it { should respond_to(:password_confirmation) }
describe "when name is not present" do
before { @user.name = " " }
it { should_not be_valid }
end
describe "when email is not present" do
before { @user.email = " " }
it { should_not be_valid }
end
describe "when name is too long" do
before { @user.name = "a" * 51 }
it { should_not be_valid }
end
describe "when email format is invalid" do
it "should be invalid" do
addresses = %w[user@foo,com user_at_foo.org example.user@foo.]
addresses.each do |invalid_address|
@user.email = invalid_address
@user.should_not be_valid
end
end
end
describe "when email format is valid" do
it "should be valid" do
addresses = %w[user@foo.com A_USER@f.b.org frst.lst@foo.jp a+b@baz.cn]
addresses.each do |valid_address|
@user.email = valid_address
@user.should be_valid
end
end
end
describe "when email address is already taken" do
before do
user_with_same_email = @user.dup
user_with_same_email.save
end
it { should_not be_valid }
end
end
.
file: models/user.rb
# == Schema Information
#
# Table name: users
#
# id :integer not null, primary key
# name :string(255)
# email :string(255)
# created_at :datetime not null
# updated_at :datetime not null
# password_digest :string(255)
#
class User < ActiveRecord::Base
attr_accessor :password, :password_confirmation
attr_accessible :email, :name
# attr_accessible :email, :name
# attr_accessible :email, :name, :password, :password_confirmation
before_save { |user| user.email = email.downcase }
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true,
format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }
#validates :password, length: { minimum: 6 }
#validates :password_confirmation, presence: true
end