Ruby on rails 4 Rails教程:未定义的方法
我又卡住了!在Rails教程第9章第9.2.2节中。我越来越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
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