2014-02-14 37 views
0

实际上,我被困在第9章的迈克尔·哈特尔Rails的教程: http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-users#sec-unsuccessful_edits迈克尔·哈特尔Rails的教程 - 未定义的方法“sign_in”

当我运行命令行:

$ bundle exec rspec spec/requests/user_pages_spec.rb -e "edit page" 

我有错误:

Failure/Error: sign_in user 
NoMethodError: undefined method 'sign_in' for #<RSpec::Core::ExampleGroupe::Nested_1::Nested_4::Nested_1:0x4e7a0b8> 

问题来自这个代码spec/requests/user_pages_spec.rb

describe "edit" do 
    let(:user) { FactoryGirl.create(:user) } 
    before do 
    sign_in user 
    visit edit_user_path(user) 
    end 
end 

sign_inapp/helpers/sessions_helper.rb实际上定义:

def sign_in(user) 
    remember_token = User.new_remember_token 
    cookies.permanent[:remember_token] = remember_token 
    user.update_attribute(:remember_token, User.encrypt(remember_token)) 
    self.current_user = user 
end 

def signed_in? 
    !current_user.nil? 
end 

def current_user=(user) 
    @current_user = user 
end 

def current_user 
    remember_token = User.encrypt(cookies[:remember_token]) 
    @current_user ||= User.find_by(remember_token: remember_token) 
end 

而且SessionsHelper被包括在app/controllers/application_controller.rb

class ApplicationController < ActionController::Base 
    protect_from_forgery with: :exception 
    include SessionsHelper 
end 

你有一个解决方案?

回答

1

您的user_pages_spec.rb是一个测试规范。它需要测试帮助程序中的sign_in方法,而不是我确定的应用程序的帮助程序。我之前做过这个教程,但刚刚回顾。我认为你需要添加一些spec/support/utilities.rb,它为你的规格提供了一个sign_in方法。

在哈特尔的GitHub库最终的答案是:

include ApplicationHelper 

def sign_in(user) 
    visit signin_path 
    fill_in "Email", with: user.email 
    fill_in "Password", with: user.password 
    click_button "Sign in" 
    # Sign in when not using Capybara as well. 
    cookies[:remember_token] = user.remember_token 
end 

这应该是你的规格/支持/ utilities.rb决赛。

在教程本身,他在第9.6节中提到了这一点。

代码9.6。测试帮手签署用户。

spec/support/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] = remember_token 
    user.update_attribute(:remember_token, User.encrypt(remember_token)) 
    else 
    visit signin_path 
    fill_in "Email", with: user.email 
    fill_in "Password", with: user.password 
    click_button "Sign in" 
    end 
end 

这显然从最终的不同,但是,我想这就是你需要开始。

+1

问题来自'include ApplicationHelper',它不在我的'utilities.rb'文件中。我刚刚添加了这一行,现在它是工作。 感谢您的帮助! – benjaminzanatta

+0

很高兴我能给你一个权利:)。 – Art

相关问题