feat(sample): add session and header

This commit is contained in:
songtianlun 2025-01-01 15:44:50 +08:00
parent 9fac43f46d
commit 8baa51f611
8 changed files with 105 additions and 7 deletions

View File

@ -3,5 +3,6 @@
// Configure your import map in config/importmap.rb. Read more: https://github.com/rails/importmap-rails // Configure your import map in config/importmap.rb. Read more: https://github.com/rails/importmap-rails
import "@hotwired/turbo-rails" import "@hotwired/turbo-rails"
import "sample_app/app/assets/javascripts/controllers" // import "sample_app/app/assets/javascripts/controllers"
//= require "controllers"
//= require bootstrap-sprockets //= require bootstrap-sprockets

View File

@ -0,0 +1,20 @@
class SessionsController < ApplicationController
include SessionsHelper
def new
end
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
reset_session
log_in user
redirect_to user
else
flash.now[:danger] = 'Invalid email/password combination'
render 'new'
end
end
def destroy
end
end

View File

@ -0,0 +1,15 @@
module SessionsHelper
def log_in(user)
session[:user_id] = user.id
end
def current_user
if session[:user_id]
@current_user ||= User.find_by(id: session[:user_id])
end
end
def logged_in?
!current_user.nil?
end
end

View File

@ -5,7 +5,24 @@
<ul class="nav navbar-nav navbar-right"> <ul class="nav navbar-nav navbar-right">
<li><%= link_to "Home", root_url %></li> <li><%= link_to "Home", root_url %></li>
<li><%= link_to "Help", help_url %></li> <li><%= link_to "Help", help_url %></li>
<li><%= link_to "Login in", '#' %></li> <% if logged_in? %>
<li><%= link_to "Users", '#' %></li>
<li 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 "Log out", logout_path, method: :delete %>
</li>
</ul>
</li>
<% else %>
<li><%= link_to "Login in", login_url %></li>
<% end %>
</ul> </ul>
</nav> </nav>
</div> </div>

View File

@ -0,0 +1,18 @@
<% provide(:title, "Log in") %>
<h1>Log in</h1>
<div class ="row">
<div class="col-md-6 col-md-offset-3">
<%= form_with(url: login_path, scope: :session, local: true) do |f| %>
<%= f.label :email %>
<%= f.email_field :email, class: 'form-control' %>
<%= f.label :password %>
<%= f.password_field :password, class: 'form-control' %>
<%= f.submit "Log in", class: "btn btn-primary" %>
<% end %>
<p>New user? <%= link_to "SIgn up now!", signup_path %></p>
</div>
</div>

View File

@ -1,4 +1,5 @@
Rails.application.routes.draw do Rails.application.routes.draw do
# get "sessions/new"
# get "users/new" # get "users/new"
# get "static_pages/home" # get "static_pages/home"
# get "static_pages/help" # get "static_pages/help"
@ -12,6 +13,10 @@ Rails.application.routes.draw do
get '/contact', to: 'static_pages#contact' get '/contact', to: 'static_pages#contact'
get '/signup', to: 'users#new' get '/signup', to: 'users#new'
get '/login', to: 'sessions#new'
post 'login', to: 'sessions#create'
delete '/logout', to: 'sessions#destroy'
resources :users resources :users
# Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html

View File

@ -0,0 +1,8 @@
require "test_helper"
class SessionsControllerTest < ActionDispatch::IntegrationTest
test "should get new" do
get login_path
assert_response :success
end
end

View File

@ -0,0 +1,14 @@
require "test_helper"
class UsersLoginTest < ActionDispatch::IntegrationTest
test "login with invalid information" do
get login_path
assert_template 'sessions/new'
post login_path, params: { session: {
email: "", password: "" } }
assert_template 'sessions/new'
assert_not flash.empty?
get root_path
assert flash.empty?
end
end