0

我试图在显示页面上实现基本和高级查看模式之间的切换,本质上是通过链接打开/关闭基本/高级 div。在控制器中,我将查看模式存储在会话变量中(使用与http://railscasts.com/episodes/199-mobile-devices类似的方法)。问题:切换查看模式可以正常工作,但是当我在非默认查看模式中单击指向不同显示页面的链接时,它会将我带回默认模式,这是为什么呢?

显示.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:我在添加 hack 后让它工作,将“a.json”设置为“a”,这不是一个很好的解决方案,但它可以工作:

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

3 回答 3

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>
于 2012-12-06T09:24:11.013 回答
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>
于 2012-12-06T09:40:25.973 回答
0

有同样的问题 - 会话变量没有持久化,我使用了很多会话变量,所以我认为这是重新创建错误的关键

但是我已经通过使用 cookie 而不是 session 克服了这个问题

只是简单地代替

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 后,我无法发现任何非持久性问题。

于 2014-05-14T21:32:05.600 回答