私はこのチュートリアルの後に、ユーザログインを監視するwebappを構築するためにhttps://www.railstutorial.org/book/basic_login をビルドします。ユーザーを適切にログインさせることができましたが、Michael Hartlのコードをすべて守っても問題はあります。Railsチュートリアルログイン/ログアウトフォームが機能しない
- 私はブラウザにユーザーのURLを貼り付けることができますが、それでも引き上げるので(実際にログインする必要はありません)。つまり、「localhost:3000/users/1」と入力すると、ログインしているかどうかに関係なく、ページに移動します。
私は、ユーザーがログインしたとき、またはログインしていないときに、たくさんのファイル(コードについては以下を参照)を表示してapp/views/layoutsフォルダに入れました。ユーザーがログインしていない場合にログインページに表示されている場合は、ヘッダーバーに「ログアウト」と表示しないでください。タブにログインした後、私はこのエラーを取得する: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章のすべてをコピーして貼り付けましたが、まだ破損しています –
SessionsHelperとSessionsControllerの2つの#destroyメソッドがあります。私はチュートリアルであなたのコードと実際のコードに違いがあるので、見直しを続けます。力があなたと一緒になるかもしれない:) – jedi
だから、私は助けのためにセッションヘルパーのおかげで削除しました。しかし、問題3は未だに解決されていない。それでも経路が見つからない/ログアウトしていないというエラーがある –