Ruby on Rails - 登录或注销后redirect_to不会执行与新页面关联的 ajax/js/css 加载



我几乎完成了我的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>

最新更新