0

基本的にリンクを介して基本/高度な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
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[: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 に答える