我几乎完成了我的Ruby on Rails应用程序的登录系统。当我登录或注销时,我的会话控制器分别将用户重定向到控制面板或主页。但是,当重定向到控制面板时,body、header等上的id/class标签不会被替换,因此特定于控制面板的新HTML不会生效。当注销时重定向到主页时,任何要通过AJAX加载到主页上的动态内容都不会正常加载。我怎样才能解决这个奇怪的问题?
这是我的会话控制器:
class SessionsController < ApplicationController
before_action :authenticate_user, :only => [:control_panel]
before_action :not_logged_in, :only => [:create]
# CREATE SESSION
def create
respond_to do |format|
if params[:username_or_email].blank? or params[:login_password].blank?
# Give feedback for incomplete form
flash[:feedback] = "Some fields were left empty."
format.js and return
end
if params[:username_or_email].include? '@'
user = User.find_by_email(params[:username_or_email])
else
user = User.find_by_username(params[:username_or_email])
end
if user && user.authenticate(params[:login_password])
session[:user_id] = user.id
format.html do
redirect_to ctrl_path, :notice => "Welcome back, #{user.username}" # Redirect to control panel
end
else
# Give feedback if credentials incorrect
flash[:feedback] = "The username, email, or password entered was incorrect."
format.js
end
end
end
def control_panel
# Control panel page
end
# DELETE SESSION
def destroy
reset_session
redirect_to root_path
end
end
任何想法或帮助是非常感激的!编辑以下是我的一些观点
application.html.erb
<!DOCTYPE html>
<html>
<head>
<title><%= "Ian Hoffman | " + @title || "Railstest" %></title>
<%= csrf_meta_tags %>
<meta charset="UTF-8" />
<%= favicon_link_tag 'ruby.ico' %>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= stylesheet_link_tag "https://fonts.googleapis.com/css?family=Roboto:400,300,300italic,700|Open+Sans:400,400italic,700,300" %>
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
</head>
<body>
<%= yield %>
</body>
</html>
control_panel.html.erb
<html id="ctrl-page">
<head>
<% @title = "Control Panel" %>
</head>
<body>
<div id="wrapper">
<% if not notice.blank? %>
<h2 id="ctrl-notice"><%= "#{notice}" %></h2>
<% end %>
</div>
</body>
</html>
例如:<html id="ctrl-page">
没有在"重定向"时插入,无论Rails的重定向思想是什么。标签保持为<html>
,就像在主页中一样(由于某些原因没有显示)。
好的,这里有一些我看到有点奇怪的东西…他们中的任何一个(或其中一个)都可能是问题所在,但我会根据我所看到的进行评论。
1)你的模板control_panel
包含html
标签-你的模板永远不应该。HTML标签总是由布局完成的…模板的内容被插入到yield
部分的布局中——如果你在html标签中嵌套html标签,那么浏览器经常会做一些奇怪的、意想不到的事情。这是最有可能解决您的问题的候选
2)从技术上讲,user
变量超出了控制器操作的范围:
if params[:username_or_email].include? '@'
user = User.find_by_email(params[:username_or_email])
else
user = User.find_by_username(params[:username_or_email])
end
user在if-section中被定义…但不是在外面…如果这真的有效,我担心的只是副作用。更符合轨道标准的做法是将其拉回更高的范围,例如使用:
user = if params[:username_or_email].include? '@'
User.find_by_email(params[:username_or_email])
else
User.find_by_username(params[:username_or_email])
end
这是我最讨厌的事:
<%= "#{notice}" %>
Notice已经是一个字符串了…如果不是,那么<%= %>
标签就会调用to_s
。所以你不需要在另一个字符串中插入它来使它更字符串化:)
直接使用,例如:
<%= notice %>
4)最后-我真的希望你设置这个登录的东西只是为了好玩,并了解如何做身份验证…但我们不会在实际的系统上部署它。没有一个程序员足够聪明,能够智胜那些已知的入侵Rails的漏洞的综合智慧……相反,专业地,我们几乎普遍使用一个值得信赖的宝石-大多数人使用devise
。如果你真的想实现自己的安全系统,那么你需要阅读all安全指南:http://guides.rubyonrails.org/security.html要了解实现一个真正安全的系统有多难……一旦你完成了这些,你就会意识到这个指南已经过时了……
也就是说,如果你这样做是为了好玩和学习,那就太酷了……我也这样做过:)在你开始处理任何真正重要的事情(包括你的用户个人数据)之前,把它换成设计吧。
编辑
你的结束模板应该看起来像这样:
<% @title = "Control Panel" %>
<div id="wrapper">
<% if not notice.blank? %>
<h2 id="ctrl-notice"><%= "#{notice}" %></h2>
<% end %>
</div>