2017-03-05 80 views
0

我正在按照本教程https://www.railstutorial.org/book/basic_login 構建一個webapp來監視用戶登錄。我設法讓用戶正確登錄,但即使我遵循Michael Hartl的所有代碼,也存在一些問題。Rails教程登錄/註銷表單無法正常工作

  1. 我可以粘貼在使用者的網址到瀏覽器,它仍然會拉起來(所以實際上不需要登錄)。即:鍵入「本地主機:3000 /用戶/ 1」,它會帶我到頁面,無論是否登錄。
  2. 我在我的app/views/layouts文件夾中有許多文件(請參閱下面的代碼)在用戶登錄或未登錄時顯示內容。問題是無論用戶登錄或出在任何頁面(即:如果用戶沒有登錄,並在登錄頁面上標題欄不應該說「註銷」)錯誤圖片:https://i.stack.imgur.com/tzRLj.png

  3. 當我去點擊註銷登錄後標籤,我得到這個錯誤:https://i.stack.imgur.com/H5umj.png

我很困惑,爲什麼會出現這些錯誤,因爲我跟哈特我的教程和他說的一樣。

代碼:

的routes.rb

Rails.application.routes.draw do 
    get 'sessions/new' 

    get 'users/new' 

    root 'sessions#new' 
    get '/home', to:'sessions#new' 
    get '/search', to:'pages#search' 
    get '/people', to:'pages#people' 
    get '/profilepage', to:'pages#profilepage' 
    get '/signup', to: 'users#new' 
    post '/signup', to: 'users#create' 
    get '/login', to: 'sessions#new' 
    post '/login', to: 'sessions#create' 
    delete '/logout', to: 'sessions#destroy' ## this breaks stuff idk why 
    #get '/logout' => :destroy, to: 'sessions#new' #This "works" but has the issue of #1 
    resources :users 

end 

應用/視圖/佈局/ _header.html.erb:

<header class="navbar navbar-fixed-top navbar-inverse"> 
     <div class="container"> 
     <nav> 
      <ul class="nav navbar-nav navbar-right"> 
      <li><%= link_to "Home", root_path %></li> 
      <% if logged_in? %> 
       <li><%= link_to "Users", '#' %></li> 
       <li> 
        <%= link_to "Log out", logout_path, method: "delete" %> 
        </li> 
      <% else %> 
       <li><%= link_to "Log in", login_path %></li> 
      <% end %> 
      </ul> 
     </nav> 
     </div> 
    </header> 

應用/視圖/佈局/ application.html.erb :

<!DOCTYPE html> 
<html> 
    <head> 
    <title>App</title> 
    <%= csrf_meta_tags %> 

    <%= stylesheet_link_tag 'default', media: 'all', 'data-turbolinks-track': 'reload' %> 
    <%= javascript_include_tag 'default', 'data-turbolinks-track': 'reload' %> 
    </head> 

    <body> 
    <%= render 'layouts/header' %> 
    <div class="container"> 
     <% flash.each do |message_type, message| %> 
     <div class="alert alert-<%= message_type %>"><%= message %></div> 
     <% end %> 
     <%= yield %> 
     <%= render 'layouts/footer' %> 
     <% if false %> 
     <%= debug(params) if Rails.env.development? %> 
     <% end %> 
    </div> 
    </body> 
</html> 

會話控制器:

class SessionsController < ApplicationController 

     def new 
     end 

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

     def destroy 
     log_out 
     redirect_to root_url 
     end 
    end 

會議助手:

module SessionsHelper 

     # Logs in the given user. 
     def log_in(user) 
     session[:user_id] = user.id 
     end 

     # Returns the current logged-in user (if any). 
     def current_user 
     @current_user ||= User.find_by(id: session[:user_id]) 
     end 

     def logged_in? 
     !current_user.nil? 
     end 

     def log_out 
     session.delete(:user_id) 
     @current_user = nil 
     end 

     def destroy 
     log_out 
     redirect_to root_url 
     end 
    end 

耙路線:

enter image description here

回答

0

你下面的教程是正確的,我已經嘗試過了自己和它的工作對我罰款這麼清楚你的代碼中有些東西已經搞亂了:)請檢查你的代碼並在出現任何問題時提供你的rake routes輸出以及y我們的控制檯的輸出。

+0

我真的很困惑,爲什麼代碼不工作。我直接複製並粘貼了教程中第6-8章的所有內容,但它仍然中斷 –

+0

您有2個#destroy方法:在SessionsHelper和SessionsController中。我發現代碼和教程中的實際代碼存在差異,請繼續閱讀。可能的力量與你:) – jedi

+0

好吧,所以我刪除了會議幫手感謝您的幫助。但是,問題3仍然沒有解決。它仍然有沒有找到/註銷路線的錯誤 –