Ruby on rails 我的会话变量赢了';t更新(Ruby on Rails)

Ruby on rails 我的会话变量赢了';t更新(Ruby on Rails),ruby-on-rails,session,model-view-controller,session-variables,Ruby On Rails,Session,Model View Controller,Session Variables,我是RubyonRails的新手,我正在努力理解基本知识。 我的应用程序遵循MVC框架,我试图从控制器更新会话变量,然后从视图访问它 以下是我在控制器中的代码(这是我唯一更新变量的地方): 我使用javascript在视图中单击登录按钮时调用此方法: function login(){ <% testLogin_method %> } 函数登录(){ } 当我注销时,我称之为: <li><%= link_to raw('<span class="gly

我是RubyonRails的新手,我正在努力理解基本知识。 我的应用程序遵循MVC框架,我试图从控制器更新会话变量,然后从视图访问它

以下是我在控制器中的代码(这是我唯一更新变量的地方):

我使用javascript在视图中单击登录按钮时调用此方法:

function login(){
  <% testLogin_method %>
}
函数登录(){
}
当我注销时,我称之为:

<li><%= link_to raw('<span class="glyphicon glyphicon-log-out"></span> Log out'), :controller => "static_pages", :action => "testLogin_method" %></li>
  • “静态页面”,操作=>“testLogin\u方法”%>
  • 我的问题是,当我注销时,应用程序确实重定向到登录页面,但会话[:loggedIn]保持为true。我怎样才能保证它是假的

    编辑:如何将变量会话从true切换为false?登录/注销只是为了上下文,我不想实际进行身份验证


    另外,我没有使用gemdevise,因为我只是想了解会话变量是如何工作的,这只是一个示例。

    您的javascript方法有效吗

    因为这不是帮手的工作方式。当呈现页面时,它将调用
    testLogin\u方法
    ,而不是在执行javascript时。检查渲染JS的源代码


    帮助程序在服务器端用于帮助呈现页面。在客户端,您将不得不从JavaScript到TestLogin方法> /代码>

    > P>。如果您想要一个使用会话的体例,请考虑这个例子:

    # config/routes.rb
    resource :session, only: [:new, :create, :destroy]
    
    # app/models/user.rb
    class User < ApplicationRecord
      has_secure_password
    end
    
     # app/helpers/session_helper.rb
    module SessionHelper
      def current_user
        @current_user ||= User.find(session[:user_id]) if session[:user_id]
      end
    
      def user_signed_in?
        current_user.is_a?(User)
      end
    end
    
    # app/controllers/session_controller.rb
    class SessionController < ApplicationController
    
      def new
      end
    
      def create
        reset_session
        @user = User.find_by(params[:email])
        if @user.try(:authenticate, params[:password])
          session[:user_id] = @user.id
          redirect_to :root, success: 'You have been signed in.'
        else
          render :new, error: 'Wrong email or password.'
        end
      end
    
      def destroy
        reset_session
        flash[:success] = 'You have been signed out.' 
        respond_to do |f|
          f.html { redirect_to :root }
          f.json { head :ok } 
        end
      end
    end
    
    然后,我们设置一个ajax侦听器来重新加载页面:

    $(document).on('ajax:success', '#logout', function(){
      Turbolinks.clearCache();
      Turbolinks.visit(location.toString());
    });
    

    您可以就地更新页面以更改登录和注销之间的状态,但更好的解决方案是刷新缓存并重新加载页面。否则,您的登录/退出处理程序必须跟踪任何
    用户是否登录?
    在页面上键入条件。

    现在跳过javascript。不管怎么说,你似乎已经够迷惑的了。是的,它是有效的,但在我调用它之前,它说我的会话变量是未定义的,然后在它说真的之后。敏锐的人会注意到,使用ajax实际上什么都做不到。一个普通的
    按钮\u to
    也可以完成这项工作。谢谢,这是身份验证的一个很好的例子,但它没有回答我的问题,我只是想知道为什么它没有更新?我使用术语登录和注销作为上下文。如何打开/关闭会话变量?您的整个示例完全失败了,因为您似乎不了解服务器端和客户端发生了什么。示例不起作用的原因是渲染视图时会计算
    。当javascript被执行时不会。那么我如何从我的视图调用控制器的方法呢?你不能从视图调用控制器的方法。用户单击创建控制器响应的HTTP请求的链接和表单。如果您想通过javascript实现这一点,您需要发送一个ajax请求。但是再一次。学习ruby&然后使用老式的同步方式进行rails。一旦您了解了MVC和客户机/服务器模型,就可以开始使用ajax了。
    <%= button_to session_path, id: 'logout', method: :delete, remote: { true , type: 'json' } do %>
      <span class="glyphicon glyphicon-log-out"></span> Log out
    <% end %>
    
    $(document).on('ajax:success', '#logout', function(){
      Turbolinks.clearCache();
      Turbolinks.visit(location.toString());
    });