切换后会话变量不持久 [英] Session variable not persisting after switch

查看:42
本文介绍了切换后会话变量不持久的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试在显示页面上实现基本和高级查看模式之间的切换,实质上是通过链接打开/关闭基本/高级 div.在控制器中,我将查看模式存储在会话变量中(使用类似于 http://railscasts.com/episodes/199-mobile-devices).问题:切换可以很好地更改查看模式,但是一旦我在非默认查看模式中单击指向其他显示页面的链接,它就会将我带回默认模式,这是为什么?

show.html.erb

<% 如果是viewing_mode?%><%= link_to "Advanced", {mode: 0} %><%其他%><%= link_to "Basic", {mode: 1} %><%结束%><% 如果查看模式?%><div class="container" id="basic">这是基本视图

<%其他%><div class="container" id="advanced">这是高级视图

<%结束%>

控制器

before_filter :prepare_for_viewingdefviewing_mode?如果会话[:viewing_param]session[:viewing_param] == "1"别的session[:viewing_param] == "0"结尾结尾helper_method :viewing_mode?def prepare_for_viewingsession[:viewing_param] = params[:mode] 如果 params[:mode]结尾

编辑 1:显示会话参数表明 :viewing_params 从:

"viewing_param"=>"1"

"viewing_param"=>"1.json"

点击节目页面上的链接后.这可能是问题所在,但是为什么viewing_param 会被这样修改呢?

编辑 2:我在添加一个 hack 后让它工作,将a.json"设置为a",不是一个很好的解决方案,但它有效:

def prepare_for_viewingsession[:viewing_param] = params[:mode][0] 如果 params[:mode]结尾

解决方案

这个方法好像不对?我发表了一些评论

defviewing_mode?# 这对于除 nil 和 false 之外的所有值都成立如果会话[:viewing_param]# 应该在这里测试吗?或者设置一个值?session[:viewing_param] == "1"别的# 此处永远不能为0",因为该值在上面的测试中为真session[:viewing_param] == "0"结尾结尾

你正在使用这个:

link_to "Advanced", {mode: 1}

对于高级链接,在此:

before_filter :prepare_for_viewingdef prepare_for_viewingsession[:viewing_param] = params[:mode] 如果 params[:mode]结尾

您正在将 session[:viewing_param] 设置为 "1"(高级时),然后在

defviewing_mode?如果会话[:viewing_param]session[:viewing_param] == "1"别的session[:viewing_param] == "0"结尾结尾

你说得对,因此会给你基本"的观点:

<% 如果是viewing_mode?%><div class="container" id="basic">这是基本视图

I have tried to implement a switch between a basic and advanced viewing mode on a show page, essentially switching a basic/advanced div on/off through a link. In the controller I store the viewing-mode in a session variable (using a similar approach to http://railscasts.com/episodes/199-mobile-devices). Problem: the toggling works fine changing the viewing mode, but as soon as I click on a link to a different show-page in the non-default viewing-mode it takes me back to the default-mode, why is this?

show.html.erb

<% if viewing_mode? %>
    <%= link_to "Advanced", {mode: 0}  %>
<% else %>
    <%= link_to "Basic", {mode: 1} %>
<% end %>

<% if viewing_mode? %>
  <div class="container" id="basic">
   This is the basic view
  </div>

<% else %>
  <div class="container" id="advanced">
  This is the advanced view
  </div>
<% end %>

Controller

before_filter :prepare_for_viewing

def viewing_mode?
  if session[:viewing_param]
    session[:viewing_param] == "1"
  else
    session[:viewing_param] == "0"
  end
end
helper_method :viewing_mode?

def prepare_for_viewing
  session[:viewing_param] = params[:mode] if params[:mode]
end

Edit 1: Displaying the session parameters shows that the :viewing_params changes from:

"viewing_param"=>"1"

to

"viewing_param"=>"1.json"

after clicking on a link on a show page. This might be the problem, but why is the viewing_param modified in this way?

Edit 2: I got it to work after adding a hack, setting the "a.json" to "a", not a nice solution but it works:

def prepare_for_viewing
  session[:viewing_param] = params[:mode][0] if params[:mode]
end

解决方案

This method seems to be incorrect? I made some comments

def viewing_mode?
  # this is true for all values except nil and false
  if session[:viewing_param]
    # should it be test here? Or setting a value?
    session[:viewing_param] == "1"
  else
    # can never be "0" here, because that value gives true in the test above
    session[:viewing_param] == "0"
  end
end

You are using this:

link_to "Advanced", {mode: 1}

for advanced link, and in this:

before_filter :prepare_for_viewing
def prepare_for_viewing
  session[:viewing_param] = params[:mode] if params[:mode]
end

You are setting session[:viewing_param] to "1" (when advanced), then in

def viewing_mode?
  if session[:viewing_param]
    session[:viewing_param] == "1"
  else
    session[:viewing_param] == "0"
  end
end

You are getting true, and that will give you "basic" view because of this:

<% if viewing_mode? %>
  <div class="container" id="basic">
   This is the basic view
  </div>

这篇关于切换后会话变量不持久的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
其他开发最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆