1

私は 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
4

3 に答える 3

3

セクション6.3.2のみを使用している場合、テストは失敗するはずです。次のセクションでこれを修正します。

于 2012-04-28T21:52:12.827 に答える
2

モデルに has_secure_password を追加すると、問題が修正されます。本(後編)にもあります。

于 2012-09-13T03:03:20.237 に答える
0

エラーは「テーブル'ユーザー'が見つかりませんでした」について不平を言っていると思います。試してみてください。

rake db:migrate 
rake db:load:test
于 2012-04-28T21:41:14.030 に答える