2016-08-15 23 views
0

我几乎完成了为Ruby on Rails应用程序实现登录系统。当我登录或注销时,我的会话控制器将用户分别重定向到控制面板或主页。但是,当重定向到控制面板时,正文,标题等上的id/class标签不会被替换,因此控制面板专用的新HTML不会生效。在退出时重定向到首页时,通过AJAX加载到主页上的任何动态内容都不会像平常那样加载。我怎样才能解决这个奇怪的问题?Ruby on Rails - 登录或注销后的redirect_to不会执行与新页面相关的ajax/js/css加载

这里是我的会话控制器:

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>,就像在主页(由于原因未显示)。

+0

你能也分享您的视图代码? – Milind

+0

增加了一些意见 –

+0

这可能是我的应用程序控制器覆盖的东西的错?当我重新加载页面时,ajax内容/不同的html显示正确。 –

回答

0

好的,我发现有几件事情在这里有点奇怪......其中任何一个(或其中之一)都可能成为问题,但我会评论我能看到的内容。

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 params[:username_or_email].include? '@' 
      User.find_by_email(params[:username_or_email]) 
     else 
      User.find_by_username(params[:username_or_email]) 
     end 

3)这是我的一个忌讳:

<%= "#{notice}" %> 

公告已经是一个字符串。 ..如果不是,那么<%= %>标签就会调用to_s,无论如何它们都在里面。所以,你不需要插值它的另一个刺痛里面,使之更 :)

代替,只需直接使用如它:

<%= notice %> 

4)最后 - 我真的希望你'设置这个登录的东西只是为了好玩,并了解如何进行身份验证......但不会真正将其部署到实际的实时系统上。 没有任何一个程序员足够聪明,可以智胜已知的黑客入侵Rails的功能......专业而言,我们几乎普遍使用值得信赖的宝石 - 大多数人使用devise。 如果你真的想要实现你自己的安全系统,那么你需要阅读全部通过这里的安全指南:http://guides.rubyonrails.org/security.html 来了解如何实现真正的安全系统......以及那么一旦你意识到这本指南已经过时了...

这就是说 - 如果你是为了做爱而学习,那真是太酷了...我已经做到这一点:) 只需将它替换为Devise,然后再与真正重要的任何事情(包括您的用户的个人数据)一起生活。


编辑

您的最终模板应该只是看起来像这样:

<% @title = "Control Panel" %> 
<div id="wrapper"> 
    <% if not notice.blank? %> 
    <h2 id="ctrl-notice"><%= "#{notice}" %></h2> 
    <% end %> 
</div> 
+0

我需要排除我的control_panel模板的部分吗?我需要使用@title变量来设置标题。我应该在哪里做这件事? –

+0

是的,我会排除它......你在技术上不需要把你的'@ title'设置放在任何标记内......它仍然会像你的模板的顶部浮动ruby-tag一样工作。闪耀:铁轨魔法! :闪耀::) –

+0

问一个愚蠢的问题。忽视 –