2012-04-29 28 views
6

Chương này đang thêm các thẻ ghi nhớ để đảm bảo trạng thái đăng nhập của người dùng được ghi nhớ và phiên đó chỉ bị xóa khi người dùng đăng xuất rõ ràng. Tôi hiểu tầm quan trọng của việc có tính năng này trong ứng dụng của tôi, vì vậy, hãy đảm bảo rằng nó hoạt động chính xác. Tôi nhận được một loạt các sai sót tuy nhiên, khi tôi chạyChương 8 Rails Hướng dẫn Ghi nhớ lỗi Token

$ bundle exec rspec spec/ 

và tôi nghi ngờ họ phải làm với mô hình của tôi sử dụng, vì họ tất cả ngoại trừ một chứa:

NoMethodError: 
     undefined method `remember_token=' for #<User:...> 

và chứa cuối cùng

Failure/Error: it { should respond_to(:remember_token) } 

rồi trỏ chuột vào user_spec.rb, user.rb, và và các tập tin authentication_pages_spec.rb của tôi, mà tôi đã bao gồm hầu hết (những phần thích hợp) ở đây.

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 
# 

class User < ActiveRecord::Base 
    attr_accessible :name, :email, :password, :password_confirmation 
    has_secure_password 

    before_save { |user| user.email = email.downcase } 
    before_save :create_remember_token 

    validates :name, presence: true, length: { maximum: 50 } 
    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][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 

    private 

     def create_remember_token 
     self.remember_token = SecureRandom.urlsafe_base64 
     end 
end 

authentication_pages_spec.rb:

require 'spec_helper' 

describe "Authentication" do 

    subject {page} 
    describe "signin page" do 
    before { visit signin_path } 
    it {should have_selector('h1', text: 'Sign in')} 
    it {should have_selector('title', text: 'Sign in')} 
    end 

    describe "signin" do 
    before {visit signin_path} 

    describe "with invalid information" do 
     before {click_button "Sign in"} 

     it {should have_selector('title', text: 'Sign in')} 
     it {should have_selector('div.alert.alert-error', text: 'Invalid')} 

     describe "after visiting another page" do 
       before { click_link "Home" } 
       it { should_not have_selector('div.alert.alert-error') } 
      end 
    end 

    describe "with valid information" do 
      let(:user) { FactoryGirl.create(:user) } 
      before do 
      fill_in "Email", with: user.email 
      fill_in "Password", with: user.password 
      click_button "Sign in" 
      end 

      it { should have_selector('title', text: user.name) } 
      it { should have_link('Profile', href: user_path(user)) } 
      it { should have_link('Sign out', href: signout_path) } 
      it { should_not have_link('Sign in', href: signin_path) } 
      end 
    end 
end 

và đầu user_spec.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 
# 

require 'spec_helper' 

describe User do 

    before do 
     @user = User.new(name: "Example User", email: "[email protected]", 
         password: "foobar", password_confirmation: "foobar") 
    end 

    subject { @user } 

    it { should respond_to(:name) } 
    it { should respond_to(:email) } 
    it { should be_valid } 
    it { should respond_to(:password_digest) } 
    it { should respond_to(:password) } 
    it { should respond_to(:password_confirmation) } 
    it { should respond_to(:authenticate) } 
    it { should respond_to(:remember_token) } 

    describe "remember token" do 
     before { @user.save } 
     its(:remember_token) { should_not be_blank } 
    end 
. 
. 
. 

Bất kỳ trợ giúp sẽ được nhiều đánh giá cao!

Trả lời

4

Nếu bạn nhận được lỗi này trong sản xuất trên Heroku, sau khi bạn chạy:

heroku run rake db:migrate 

bạn cần phải khởi động lại ứng dụng của bạn:

heroku restart 
+0

Điều này đã khắc phục được sự cố của tôi vì nó chỉ có trên Heroku. Tôi đã cố gắng kiểm tra đăng ký trước khi di chuyển. Sau đó, ngay cả 'heroku chạy db: migrate' sẽ không khắc phục được sự cố. Như thường lệ, tôi nên thử tắt và bật lại. – brodney

2

Bạn đã tạo di chuyển để thêm cột vào Mô hình người dùng chưa?

$ rails generate migration add_remember_token_to_users 

Sau khi chỉnh sửa các tập tin này di cư để thêm lĩnh vực mới remember_token

Sau đó bạn cần làm

$ bundle exec rake db:migrate 
$ bundle exec rake db:test:prepare 

chú thích của bạn trên mô hình không hiển thị cột. Hãy chắc chắn rằng bạn đã thực hiện các lệnh trên.

+1

Cảm ơn phản hồi của bạn! Tôi đã tạo ra quá trình di chuyển nhưng chưa thêm trường mới. Tuy nhiên, khi tôi thêm cột và chỉ mục và chạy các lệnh db, tôi nhận được các lỗi tương tự. Vì vậy, tôi đã xóa tệp _add_remember_token_to_users bằng một 'rm' đơn giản trong thư mục, sau đó chạy lại lệnh. tập tin của tôi bây giờ trông giống như {AddRememberTokenToUsers lớp skirmishdirmish

+0

kiểm tra trong bảng nếu cột tồn tại – rangalo

+0

nó. Bạn có nghĩ rằng tốt nhất là nên quay lại tất cả những thay đổi này và bắt đầu làm mới? Nếu vậy, bạn có thể chỉ cho tôi cách an toàn nhất để làm điều đó mà không làm hỏng các tệp khác không? – skirmishdirmish

-1

Tôi vừa gặp sự cố tương tự, tìm phương thức không xác định find_by_remember_token.

Đây là những gì tôi đã làm để sửa chữa nó:

heroku run rake db:migrate 

Sau đó push to Heroku lại

git push heroku 
2

tôi đã thử nghiệm tương tự không lỗi. điều tôi đã làm là tạo cột remember_token với loại chuỗi.

rails generate migration add_remember_token_to_users remember_token:string --force 

rake db:migrate RAILS_ENV=test 

sau đó, vượt qua kiểm tra.

+0

Điều này làm việc cho tôi khi tôi gặp sự cố. Câu hỏi đặt ra là "tại sao", nhưng tôi cho rằng tôi sẽ tìm ra khi tôi đi sâu hơn. – MarsAtomic

0

Tôi đã gặp vấn đề tương tự trong khi học hướng dẫn Mhartl.Tôi đã giải quyết nó. vấn đề này cho thấy coz khi bạn cơ sở dữ liệu đã có một số dữ liệu người dùng, sau đó "remember_token" di chuyển sẽ không hoạt động. bạn phải làm sạch ngày của bạn firt, sau đó làm db: di chuyển.như thế này:

rake db: thả db: tạo rake db: di chuyển (được carefull: điều này sẽ xóa tất cả dữ liệu của bạn)

hy vọng giúp đỡ

Các vấn đề liên quan