我正在按照本教程https://www.railstutorial.org/book/basic_login 構建一個webapp來監視用戶登錄。我設法讓用戶正確登錄,但即使我遵循Michael Hartl的所有代碼,也存在一些問題。Rails教程登錄/註銷表單無法正常工作
- 我可以粘貼在使用者的網址到瀏覽器,它仍然會拉起來(所以實際上不需要登錄)。即:鍵入「本地主機:3000 /用戶/ 1」,它會帶我到頁面,無論是否登錄。
我在我的app/views/layouts文件夾中有許多文件(請參閱下面的代碼)在用戶登錄或未登錄時顯示內容。問題是無論用戶登錄或出在任何頁面(即:如果用戶沒有登錄,並在登錄頁面上標題欄不應該說「註銷」)錯誤圖片:https://i.stack.imgur.com/tzRLj.png
當我去點擊註銷登錄後標籤,我得到這個錯誤: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
耙路線:
我真的很困惑,爲什麼代碼不工作。我直接複製並粘貼了教程中第6-8章的所有內容,但它仍然中斷 –
您有2個#destroy方法:在SessionsHelper和SessionsController中。我發現代碼和教程中的實際代碼存在差異,請繼續閱讀。可能的力量與你:) – jedi
好吧,所以我刪除了會議幫手感謝您的幫助。但是,問題3仍然沒有解決。它仍然有沒有找到/註銷路線的錯誤 –