2012-04-29 5 views
6

In diesem Kapitel werden Erinnerungstoken hinzugefügt, um sicherzustellen, dass der Benutzeranmeldungsstatus gespeichert wird und dass die Sitzung nur gelöscht wird, wenn der Benutzer sich ausdrücklich abmeldet. Ich verstehe, wie wichtig es ist, diese Funktion in meiner App zu haben, also stelle sicher, dass sie richtig funktioniert. Ich bin ein paar Fehler immer aber, wenn ichKapitel 8 Rails Tutorial Token-Fehler speichern

$ bundle exec rspec spec/ 

laufen und ich vermute, sie haben mit meinem Benutzermodell zu tun, da sie alle bis auf einen enthalten:

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

und das letzte enthält

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

und zeigen Sie dann auf meine user_spec.rb, user.rb und und authentication_pages_spec.rb-Dateien, die ich die meisten (die relevanten Teile) hier aufgenommen haben.

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 

und Anfang 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 
. 
. 
. 

Jede Hilfe sehr geschätzt werden würde!

Antwort

4

Wenn Sie diesen Fehler in der Produktion auf Heroku erhalten, nach Sie laufen:

heroku run rake db:migrate 

Sie müssen Ihre Anwendung neu zu starten:

heroku restart 
+0

Das behob mein Problem, wie es nur auf Heroku war. Ich habe versucht, mich vor der Migration zu registrieren. Danach würde sogar 'heroku run db: migrate' das Problem nicht beheben. Wie immer hätte ich versuchen sollen, das Gerät aus- und wieder einzuschalten. – brodney

2

Haben Sie die Migration zum Hinzufügen der Spalte zum Benutzermodell generiert?

$ rails generate migration add_remember_token_to_users 

Nach dieser bearbeiten die Migrationsdatei das neue Feld remember_token

und

Danach Sie

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

Ihre Anmerkungen auf dem Modell zeigen nicht tun müssen hinzufügen die Kolumne. Stellen Sie sicher, dass Sie die obigen Befehle ausgeführt haben.

+1

Vielen Dank für Ihre Antwort! Ich hatte die Migration generiert, aber das neue Feld nicht hinzugefügt. Als ich jedoch die Spalte und den Index hinzufügte und die db-Befehle ausführte, bekam ich dieselben Fehler. Also habe ich die Datei _add_remember_token_to_users durch ein einfaches 'rm' im Verzeichnis entfernt und dann die Befehle erneut ausgeführt. Meine Datei sieht nun wie {Klasse AddRememberTokenToUsers skirmishdirmish

+0

check in der Tabelle, ob die Spalte existiert – rangalo

+0

Es tut. Denkst du, es wäre das Beste, alle diese Änderungen rückgängig zu machen und neu anzufangen? Wenn ja, könnten Sie mir den sichersten Weg zeigen, dies zu tun, ohne andere Dateien zu beschädigen? – skirmishdirmish

-1

Ich hatte gerade das gleiche Problem, undefinierte Methode find_by_remember_token bekommen.

Hier ist, was ich tat, um es zu beheben:

heroku run rake db:migrate 

Dann drücken Sie auf Heroku wieder

git push heroku 
2

Ich habe ähnliche Testfehler fehlschlagen. was ich getan habe, ist die remember_token Spalte mit einem String-Typ zu generieren.

rails generate migration add_remember_token_to_users remember_token:string --force 

rake db:migrate RAILS_ENV=test 

danach, Test bestanden.

+0

Das funktionierte für mich, als ich auf das Problem stieß. Die Frage ist "warum", aber ich denke, ich werde es herausfinden, wenn ich tiefer tauche. – MarsAtomic

0

Ich traf das gleiche Problem beim Lernen Mhartl tutorial.I löste es. Dieses Problem tritt auf, wenn die Datenbank bereits einige Benutzerdaten enthält, dann funktioniert "remember_token" migrieren nicht. Sie müssen Ihr Datum zuerst bereinigen und dann db: migrieren.wie folgt aus:

rake db: drop db: rake db erstellen: wandern (vorsicht: Dies löscht alle Daten)

Hoffnung Hilfe