2012-04-29 10 views
6

Ten rozdział dotyczy dodawania tokenów pamiętania w celu zapewnienia, że ​​status logowania użytkownika jest pamiętany, a sesja jest czyszczona tylko wtedy, gdy użytkownik jawnie się wyloguje. Rozumiem znaczenie posiadania tej funkcji w mojej aplikacji, więc chcę się upewnić, że działa ona poprawnie. Dostaję sporo błędów chociaż, kiedy biegnęRozdział 8 Rails Samouczek Zapamiętaj Błędy tokena

$ bundle exec rspec spec/ 

i podejrzewam, że mają do czynienia z moim modelu użytkownika, jak wszyscy, ale jeden zawierać:

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

a ostatnia zawiera

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

a następnie wskaż polecenie moich user_spec.rb, user.rb, ai plików authentication_pages_spec.rb, które mam włączone większość (mają zastosowanie właściwe części) tutaj.

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 

i początek 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 
. 
. 
. 

Każda pomoc będzie bardzo mile widziana!

Odpowiedz

4

Jeśli pojawi się ten błąd w produkcji na Heroku po uruchomić:

heroku run rake db:migrate 

trzeba ponownie uruchomić aplikację:

heroku restart 
+0

Naprawiłem ten problem tak, jak było tylko na Heroku. Próbowałem przetestować rejestrację przed migracją. Potem nawet 'heroku uruchom db: migrate' nie naprawi problemu. Jak zwykle powinienem był spróbować go wyłączyć i włączyć ponownie. – brodney

2

Czy wygenerowałeś migrację do dodania kolumny do modelu użytkownika?

$ rails generate migration add_remember_token_to_users 

Po tej edytować plik migracji, aby dodać nowe pole remember_token

i

Potem trzeba zrobić

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

adnotacji na modelu nie wykazują kolumna. Upewnij się, że wykonałeś powyższe polecenia.

+1

Dzięki za odpowiedź! Wygenerowałem migrację, ale nie dodałem nowego pola. Jednak gdy dodałem kolumnę i indeks i uruchomiłem komendy db, otrzymałem te same błędy. Tak więc usunąłem plik _add_remember_token_to_users przez prosty "rm" w katalogu, a następnie ponownie uruchomiłem komendy. Mój plik wygląda teraz {AddRememberTokenToUsers klasy skirmishdirmish

+0

sprawdź w tabeli, czy kolumna istnieje – rangalo

+0

To robi. Czy uważasz, że najlepiej byłoby po prostu wycofać wszystkie te zmiany i zacząć od nowa? Jeśli tak, czy mógłbyś wskazać mi najbezpieczniejszy sposób, aby to zrobić bez uszkadzania innych plików? – skirmishdirmish

-1

Po prostu miałem ten sam problem, otrzymując niezdefiniowaną metodę find_by_remember_token.

Oto co zrobiłem to naprawić:

heroku run rake db:migrate 

Następnie wcisnąć do Heroku ponownie

git push heroku 
2

mam podobny test nie błąd. to, co zrobiłem, to wygenerować kolumnę remember_token z typem ciągu.

rails generate migration add_remember_token_to_users remember_token:string --force 

rake db:migrate RAILS_ENV=test 

po tym, test pass.

+0

To zadziałało dla mnie, gdy napotkałem problem. Pytanie brzmi: "dlaczego", ale przypuszczam, że dowiem się, kiedy będę głębiej nurkować. – MarsAtomic

0

Spotkałem ten sam problem podczas nauki samouczka Mhartl. Rozwiązałem go. ten problem jest widoczny, gdy baza danych ma już pewne dane użytkownika, a migracja "remember_token" nie będzie działać. musisz wyczyścić datę, a następnie db: migrować.tak:

rake db: drop db: create rake db: migrować (należy zachować ostrożność: to usunie wszystkie dane)

nadzieja pomaga

Powiązane problemy