2014-01-26 137 views
0

最后经过两个小时左右的这件事,我已经想出了我的7个错误中的大部分。也就是说,我有一个新的,我不知道如何摆脱它。我似乎遇到了与我提出的类似问题相同的问题,那是在我开始使用最近的git commit之前。不用说,我现在不感到好笑。总之,这里的失败:登录缺少模板

1) Authentication signin with valid information followed by signout 
Failure/Error: before { click_link "Sign out" } 
ActionView::MissingTemplate: 
    Missing template sessions/destroy, application/destroy with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder, :coffee]}. Searched in: 
    * "/Users/Brawain/rails_projects/sample_app/app/views" 
# ./spec/requests/authentication_pages_spec.rb:45:in `block (5 levels) in <top (required)>' 

我居然不知道什么样的代码是必要的,所以我会后我的所有会话的东西而这给我的麻烦规范。

认证规范

require 'spec_helper' 

describe "Authentication" do 

subject { page } 

describe "signin page" do 
before { visit signin_path } 

it { should have_content('Sign in') } 
it { should have_title('Sign in') } 
end 

describe "signin" do 
before { visit signin_path } 

describe "with invalid information" do 
    before { click_button "Sign in" } 

    it { should have_title('Sign in') } 
    it { should have_selector('div.alert.alert-error') } 

    describe "after visiting another page" do 
    before { click_link "Home" } 
    it { should_not have_selector('div.alert.alert-error') } 
    end 
end 

describe "with valid information" do 
    let(:user) { FactoryGirl.create(:user) } 

    before do 
     visit '/signin' 
     fill_in "Email", with: user.email.upcase 
     fill_in "Password", with: user.password 
     click_button "Sign in" 
    end 

    it { should have_title(user.first) } 
    it { should have_link('Profile',  href: user_path(user)) } 
    it { should have_link('Sign out', href: signout_path) } 
    it { should_not have_link('Sign in', href: signin_path) } 

    describe "followed by signout" do 
     before { click_link "Sign out" } 
     it { should have_link('Sign in') } 
    end 
end 
end 
end 

会议帮手

module SessionsHelper 

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 

def destroy 
sign_out 
redirect_to root_url 
end 

def sign_out 
current_user.update_attribute(:remember_token, 
           User.encrypt(User.new_remember_token)) 
cookies.delete(:remember_token) 
self.current_user = nil 
end 
end 

会话控制器

class SessionsController < ApplicationController 

def new 
end 

def create 
user = User.find_by(email: params[:session][:email].downcase) 
if user && user.authenticate(params[:session][:password]) 
    sign_in user 
    redirect_to user 
else 
    flash.now[:error] = 'Invalid email/password combination' 
    render 'new' 
end 
end 

def destroy 
end 
end 

会议/ new.html.erb

<% provide(:title, "Sign in") %> 
<h1>Sign in</h1> 

<div class="row"> 
<div class="span6 offset3"> 
<%= form_for(:session, url: sessions_path) do |f| %> 

    <%= f.label :email %> 
    <%= f.text_field :email %> 

    <%= f.label :password %> 
    <%= f.password_field :password %> 

    <%= f.submit "Sign in", class: "btn btn-large btn-primary" %> 
<% end %> 

<p>New user? <%= link_to "Sign up now!", signup_path %></p> 
</div> 
</div> 

这不是整个页面,但这是我的正文html代码。我已经包含它,因为它有相关的链接。

<div id="announcements"> 
    TESTER TIME!  
     <% if signed_in? %> 
     <li><%= link_to "Users", '#' %></li> 
     <li id="fat-menu" class="dropdown"> 
      <a href="#" class="dropdown-toggle" data-toggle="dropdown">Account <b class="caret"></b></a> 
      <ul class="dropdown-menu"> 
      <li><%= link_to "Profile", current_user %></li> 
      <li><%= link_to "Settings", '#' %></li> 
      <li class="divider"></li> 
      <li><%= link_to "Sign out", signout_path, method: "delete" %></li> 
      </ul> 
     </li> 
    <% else %> 
     <li><%= link_to "Sign in", signin_path %></li> 
    <% end %> 

</div> 
+0

它看起来像sessions_controller#销毁方法是空的 - 这会导致其尝试渲染销毁视图。您可能的意思是调用助手并重定向。 – Swards

回答

0

你需要在销毁会话销毁功能,然后如果你不想dislay任何退出屏幕,然后redirect_to的root_path

大多人注销

0

重定向后,您必须实现破坏方法SessionsController,不在SessionsHelper。只需将此方法(“销毁”)从SessionsHelper改为SessionsController。它应该是这样的:

sessions_controller.rb

class SessionsController < ApplicationController 
... 
    def destroy 
    sign_out 
    redirect_to root_url 
    end 
end 

sessions_helper.rb

module SessionsHelper 
    ... 

    def sign_out 
    current_user.update_attribute(:remember_token, 
            User.encrypt(User.new_remember_token)) 
    cookies.delete(:remember_token) 
    self.current_user = nil 
    end