Ruby on rails 我的会话变量赢了';t更新(Ruby on Rails)
我是RubyonRails的新手,我正在努力理解基本知识。 我的应用程序遵循MVC框架,我试图从控制器更新会话变量,然后从视图访问它 以下是我在控制器中的代码(这是我唯一更新变量的地方): 我使用javascript在视图中单击登录按钮时调用此方法: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
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到
# 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());
});