Ruby on rails 4 Rails教程:未定义的方法

Ruby on rails 4 Rails教程:未定义的方法,ruby-on-rails-4,railstutorial.org,Ruby On Rails 4,Railstutorial.org,我又卡住了!在Rails教程第9章第9.2.2节中。我越来越 bundle exec rspec spec/ ................................FFF........................ Failures: 1) Authentication authorization as wrong user submitting a GET request to the Users#edit action Failure/Error: before {si

我又卡住了!在Rails教程第9章第9.2.2节中。我越来越

bundle exec rspec spec/
................................FFF........................

Failures:

1) Authentication authorization as wrong user submitting a GET request to the Users#edit action 
 Failure/Error: before {sign_in user, no_capybara: true}
 NoMethodError:
   undefined method `new_remember_token' for #<User:0x007f8181815448>
 # ./spec/support/utilities.rb:13:in `sign_in'
 # ./spec/requests/authentication_pages_spec.rb:71:in `block (4 levels) in <top (required)>'
下面是错误消息所抱怨的method utilities.rb:

def sign_in (user, options={})
  if options[:no_capybara]
    # Sign in when not using Capybara
    remember_token = User.new_remember_token
    cookies[:remember_token]
    user.update_attribute(:remember_token, User.digest(remember_token))
  else
    visit signin_path
    fill_in "Email", with: user.email
    fill_in "Password", with: user.password
    click_button "Sign in"
  end
end
model User.rb的代码如下:

class User < ActiveRecord::Base
before_save { self.email = email.downcase}
before_create :create_remember_token
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}
has_secure_password

def User.new_remember_token
  SecureRandom.urlsafe_base64
end

def User.digest(token)
  Digest::SHA1.hexdigest(token.to_s)
end

private
  def create_remember_token
    self.remember_token = User.digest(User.new_remember_token)
  end
end

我以前在sign_in方法上遇到过麻烦,但它没有。我做错了什么?

我终于找到了我在本例中观察到的不稳定测试结果的罪魁祸首,很可能是在以前的情况下。问题似乎是rails在默认情况下不会清除测试之间的缓存。事实上,这非常可怕。看来你不能真正相信测试结果。我通过评论rails抱怨的方法并重新运行测试来实现这一点。错误依然存在,这意味着一件事——rspec只是处理文件的一些缓存版本,因此忽略了我正在进行的更改。所以,即使测试通过了,你也不能确定他们真的通过了。这真的很奇怪。在通过谷歌搜索了解到这个问题后,我找到了如何强制rails清理缓存的方法——在这里查看jaustin的回答:

强制Guard轮询也会有所帮助-
class User < ActiveRecord::Base
before_save { self.email = email.downcase}
before_create :create_remember_token
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}
has_secure_password

def User.new_remember_token
  SecureRandom.urlsafe_base64
end

def User.digest(token)
  Digest::SHA1.hexdigest(token.to_s)
end

private
  def create_remember_token
    self.remember_token = User.digest(User.new_remember_token)
  end
end