【问题标题】:Rails tutorial: undefined methodRails 教程:未定义的方法
【发布时间】:2014-05-25 13:18:24
【问题描述】:

我在 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)>'

其他 2 个错误属于同一类型。

这是导致错误的规范:

    describe "as wrong user" do
      let(:user) {FactoryGirl.create(:user)}
      let(:wrong_user) {FactoryGirl.create(:user, email: "wrong@example.com")}
      before {sign_in user, no_capybara: true}

      describe "submitting a GET request to the Users#edit action" do
        before {get edit_user_path(wrong_user)}
        specify { expect(response.body).not_to match(full_title('Edit user'))}
        specify { expect(response).to redirect_to(root_url)}
      end

      describe "submitting a PATCH request to the Users#update action" do
        before { patch user_path(wrong_user)}
        specify { expect(response).to redirect_to(root_url)}
      end
    end

这是错误消息所抱怨的方法(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

模型(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 方法时遇到了问题,但它是 miraculously disappeared。我做错了什么?

【问题讨论】:

    标签: ruby-on-rails-4 railstutorial.org


    【解决方案1】:

    我终于找到了我在这种情况下观察到的不稳定测试结果的罪魁祸首,而且很可能在以前的情况下(Failure/Error: sign_in user undefined method `sign_in'Rails named route not recognized)。问题似乎是rails默认情况下不会清除测试之间的缓存。这实际上是非常可怕的。看来您不能真正相信测试结果。我通过注释掉 rails 抱怨的方法并重新运行测试来意识到这一点。错误仍然存​​在,这意味着一件事 - rspec 只是在处理文件的一些缓存版本,因此忽略了我所做的更改。因此,即使测试通过了,您也无法确定它们是否真的通过了。这真的很奇怪。在通过谷歌搜索发现问题后,我发现了如何强制导轨清理缓存 - 在这里查看 jaustin 的答案:is Rails.cache purged between tests?

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多