我试图在节目页面上实现基本和高级观看模式之间的切换,实际上是通过链接打开/关闭基本/高级div。在控制器中,我将查看模式存储在会话变量中(使用与http://railscasts.com/episodes/199-mobile-devices类似的方法)。问题:切换工作正常改变了查看模式,但是当我在非默认查看模式中点击指向不同显示页面的链接时,它会将我带回默认模式,为什么会这样?
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 %>
控制器
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
编辑1 :显示会话参数显示:viewing_params更改为:
"viewing_param"=>"1"
到
"viewing_param"=>"1.json"
单击显示页面上的链接后。这可能是问题,但为什么以这种方式修改了viewing_param?
编辑2 :我添加了一个黑客,将“a.json”设置为“a”后,我开始工作,这不是一个很好的解决方案,但它有效:
def prepare_for_viewing
session[:viewing_param] = params[:mode][0] if params[:mode]
end
答案 0 :(得分:1)
这种方法似乎不正确?我做了一些评论
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
你正在使用这个:
link_to "Advanced", {mode: 1}
用于高级链接,在此:
before_filter :prepare_for_viewing
def prepare_for_viewing
session[:viewing_param] = params[:mode] if params[:mode]
end
您将session[:viewing_param]
设置为"1"
(提升时),然后设置为
def viewing_mode?
if session[:viewing_param]
session[:viewing_param] == "1"
else
session[:viewing_param] == "0"
end
end
你会变成现实,因此会给你“基本”观点:
<% if viewing_mode? %>
<div class="container" id="basic">
This is the basic view
</div>
答案 1 :(得分:1)
这是我认为您正在尝试做的事情(取决于默认的模式):
before_filter :prepare_for_viewing
helper_method :advanced_view_mode?, :basic_view_mode?
def advanced_view_mode?
session[:viewing_param] == '1'
end
def basic_view_mode?
!advanced_view_mode?
end
def prepare_for_viewing
session[:viewing_param] = params[:mode] if params[:mode]
end
同时尽量不要重复标记,但如果你有完全独立的视图,那么将所有不同的页面组合在一起可能是值得的。
<div class="container" id="<%= advanced_view_mode? ? 'advanced' : 'basic' %>">
This is common content
<%= render 'advanced/partial' if advanced_view_mode? %>
</div>
答案 2 :(得分:0)
有同样的问题 - 会话变量没有持续存在,我已经使用了很多会话变量,所以我认为重建错误的关键是
但是我通过使用Cookie代替会话
来克服这个问题只是简单而不是
session[:viewing_param] = ..
if session[:viewing_param]
使用
cookies[:viewing_param] = ..
if cookies[:viewing_param]
有高级选项
cookies[:key] = {
:value => 'dummy value',
:expires => 1.month.from_now,
:domain => 'domainname.com'
}
以下是删除它的方法:
cookies.delete(:key, :domain => 'domain.com')
切换到Cookie后,我无法发现任何非持久性问题。