【发布时间】:2015-02-28 19:38:19
【问题描述】:
我创建了两种类型的用户——“用户”和“商店”。我的应用程序设置为当用户登录时,他们会被发送到主页,然后通过 ruby if-elsif-else 逻辑显示他们的个人资料。
我的问题是逻辑的第二部分 elsif 不起作用,并且正在呈现主页而不是商店资料页面。
home.html.erb
<% if logged_in? %> // corresponds to "user" model
<div>
<aside class="col-md-4">
<div>
<h1>My Profile</h1>
</div>
<div class="hero-unit user_info">
<%= render 'shared/user_info' %>
</div>
<section class="hero-unit car_form">
<%= render 'shared/car_form' %>
</section>
</aside>
<div class="col-md-8">
<h1>My Cars</h1>
</div>
<div class="col-md-8">
<%= render 'shared/feed' %>
</div>
</div>
<% elsif shop_logged_in? %> // checks if a shop has logged in
<div class="col-md-8">
<%= render 'shared/shop_info' %>
</div>
<% else %> //If no one is logged in, home page is shown
<div class="broke col-md-12">
<div class="alive">
<h1>Keep your car on the road<%= link_to "Sign up now!", signup_path, class: "btn btn-lg btn-primary" %></h1>
</div>
</div>
我需要<% elsif shop_logged_in? %> 部分才能正常工作。这是在 ShopSessionHelper 中定义的:
def shop_logged_in?
!current_shop.nil?
end
然后是用于用户/驱动程序类的 SessionHelper。我有点担心两者之间的一些重叠,但它似乎工作正常(欢迎在这里提出建议)。
def logged_in?
!current_user.nil?
end
这两个应该判断是用户还是商店登录,并使用上述逻辑呈现正确的页面。为什么它不起作用?
为了完整起见,这里是我的控制器和助手的完整内容:
sessions_controller.rb
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
params[:session][:remember_me] == '1' ? remember(user) : forget(user)
redirect_to root_path
else
#Show error message
flash.now[:danger] = 'Invalid email/password combination'
render 'new'
end
end
def destroy
log_out if logged_in?
redirect_to root_url
end
end
sessions_helper.rb
module SessionsHelper
# Logs in the given user.
def log_in(user)
session[:user_id] = user.id
end
# Remembers a user in a persistent session.
def remember(user)
user.remember
cookies.permanent.signed[:user_id] = user.id
cookies.permanent[:remember_token] = user.remember_token
end
def current_user?(user)
user == current_user
end
# Returns the user corresponding to the remember token cookie.
def current_user
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: user_id)
elsif (user_id = cookies.signed[:user_id])
user = User.find_by(id: user_id)
if user && user.authenticated?(cookies[:remember_token])
log_in user
@current_user = user
end
end
end
# Returns true if the user is logged in, false otherwise.
def logged_in?
!current_user.nil?
end
def forget(user)
user.forget
cookies.delete(:user_id)
cookies.delete(:remember_token)
end
# Logs out the current user.
def log_out
forget(current_user)
session.delete(:user_id)
@current_user = nil
end
# Redirects to stored location (or to the default).
def redirect_back_or(default)
redirect_to(root_url)
session.delete(:forwarding_url)
end
# Stores the URL trying to be accessed.
def store_location
session[:forwarding_url] = request.url if request.get?
end
end
shop_sessions_controller.rb
class ShopSessionsController < ApplicationController
def new
end
def create
shop = Shop.find_by(email: params[:session][:email].downcase)
if shop && shop.authenticate(params[:session][:password])
log_in shop
params[:session][:remember_me] == '1' ? remember(shop) : forget(shop)
redirect_to root_path
else
flash.now[:danger] = 'Invalid email/password combination'
render 'new'
end
end
shop_sessions_helper.rb
module ShopSessionsHelper
# Logs in the given shop.
def log_in(shop)
session[:shop_id] = shop.id
end
# Remembers a shop in a persistent session.
def remember(shop)
shop.remember
cookies.permanent.signed[:shop_id] = shop.id
cookies.permanent[:remember_token] = shop.remember_token
end
def current_shop?(shop)
shop == current_shop
end
# Returns the shop corresponding to the remember token cookie.
def current_shop
if (shop_id = session[:shop_id])
@current_shop ||= Shop.find_by(id: shop_id)
elsif (shop_id = cookies.signed[:shop_id])
shop = Shop.find_by(id: shop_id)
if shop && shop.authenticated?(cookies[:remember_token])
log_in shop
@current_shop = shop
end
end
end
# Returns true if the shop is logged in, false otherwise.
def shop_logged_in?
!current_shop.nil?
end
def forget(shop)
shop.forget
cookies.delete(:shop_id)
cookies.delete(:remember_token)
end
# Logs out the current shop.
def log_out
forget(current_shop)
session.delete(:shop_id)
@current_shop = nil
end
# Redirects to stored location (or to the default).
def redirect_back_or(default)
redirect_to(root_url)
session.delete(:forwarding_url)
end
# Stores the URL trying to be accessed.
def store_location
session[:forwarding_url] = request.url if request.get?
end
end
【问题讨论】:
标签: html ruby-on-rails ruby controllers helpers