我一直在阅读MHartl的教程,第9章有5个持久性错误,都与LayoutLinks有关。我已经检查并重新检查了,我没有看到我的代码与他的不同之处,但在我的计算机上运行他的代码会通过所有测试。
我已粘贴下面的错误示例,突出显示它似乎显示根页面(通过“访问root_path”),即使在经过“factory(:user) - > fill_in info”后仍未登录 - > click_button“指令集。所以在那里,我认为我要么只是丢失了logged_in状态,要么根本没有注册。
有什么见解?非常感谢。这非常令人困惑。
这是错误的一个例子:
LayoutLinks when signed in should have a signout link
Failure/Error: response.should have_selector("a", :href => signout_path,
expected following output to contain a <a href='/signout'>Sign Out</a> tag:
<!DOCTYPE html>
<html>
<head>
...
...
<li><a href="/">Home</a></li>
<li><a href="/help">Help</a></li>
<li><a href="/signin">Sign in</a></li>
</ul></nav></header><!--
<header>
<nav class="round">
<ul>
<li><a href="/">Home</a></li>
<li><a href="/help">Help</a></li>
<li><a href="/signin">Sign In</a></li>
</ul>
</nav>
...
答案 0 :(得分:3)
我遇到了同样的问题,并意识到Factory(:user)调用没有将用户持久化到数据库,我最终使用以下内容使其工作:
@user = Factory(:user)
visit signup_path
fill_in :email, :with => @user.email
fill_in :name, :with => @user.name
fill_in :password, :with => @user.password
fill_in "Confirmation", :with => @user.password_confirmation
click_button
visit signin_path
fill_in :email, :with => @user.email
fill_in :password, :with => @user.password
click_button
请注意,在测试运行后,您还必须添加以下内容以清除数据库
after(:each) do
User.find_by_email(@user.email).destroy
end
答案 1 :(得分:2)
这不简单吗?你有“登录”,但没有登出路径:)意思是,也许你应该添加
<li><a href="/signout">Sign Out</a></li>
到你的观点。
答案 2 :(得分:0)
当您通过浏览器自行运行页面时,页面是否按预期工作?也就是说,当您登录时,您会收到“退出”链接吗?
答案 3 :(得分:0)
看起来测试没有正确签署用户。您可以将代码与completed sample app进行比较,看看是否可以帮助您解决问题。
答案 4 :(得分:0)
我遇到了同样的问题,我已经在日志中检查发生了什么。在SessionsHelper&gt;&gt; sign_in中,我可以看到正确设置了@current_user。稍后,当我们显示用户页面时,它会调用SessionsHelper&gt;&gt; signed_in?但现在@current_user为零,所以我没有显示'已注销'和'个人资料'链接,其中两个测试失败。
似乎正在发生的事情是,当我们登录时,我们在SessionsController的实例中这样做,它调用包含模块中的sign_in方法,该模块又在SessionsController的实例中设置@current_user / em>的。然后它重定向到用户,它将控制传递给UsersController,以及_header.html.erb中调用signed_in的代码?在UsersController的上下文中执行。但是,这个控制器有自己的@current_user变量副本,不受在SessionsController中运行sign_in的影响,所以返回nil。
答案 5 :(得分:0)
在我的案例中找到它,可能值得为你检查。我从来没有真正正确登录,因为在User.rb self.authenticate_with_salt我的第一行是
user = find_by_id(:id)
而不是
user = find_by_id(id)
通过照顾测试通过,我得到了注销等链接。
答案 6 :(得分:0)
同样的事情发生在我身上,正如Alun ap Rhisiart所发生的那样
我的问题是这个街区的第二行...
def sign_in(user)
cookies.permanent.signed[:remember_token] = [user.id, user.salt]
self.current_user = user
logger.debug "sign_in(user) - #{self.current_user}"
end
...我不小心把[user.id],[user.salt]
答案 7 :(得分:0)
执行教程的第9章我遇到了同样的问题。原因在于输入代码时我自己的不准确。
我发现(通过操纵_header.html.erb)signed_in?
中定义的app/helpers/session_helper.rb
方法工作不正确,所有这些都是由于额外的@。
我有这个(使用实例变量):
def signed_in?
! @current_user.nil?
end
但应该使用方法current_user
代替:
def signed_in?
! current_user.nil?
end