2017-03-11 18 views
0

セッション値に基づいて特定のビューをレンダリングするアプリケーションを作成しようとしています。ただし、私はセッション値を格納することができません。セッション値を取得できません

私のコントローラのようなある:

<h1>Question</h1> 

<div align="center"> 
    <% if (session[:state]).to_s == 'question_one' %> 
     <%= render partial: 'layouts/question_one' %> 
    <% else %> 
     <%= render partial: 'layouts/question_two' %> 
    <% end %> 
</div> 

<div class="buttons"> 
    <%= link_to "Next", question_path, class: "btn btn-large btn-primary" %> 
</div> 

そしてroutes.rbに、question_pathは、例えば次のように定義されます:

class MyController < ApplicationController 
    def question 
    if session[:state].nil? 
     session[:state] = 'question_one' 
    end 
    end 

    def next_page 
    # state pattern would be much better, this is a bit ugly 
    if session[:state].nil? || session[:state] == 'question_one' 
     session[:state] = 'question_two' 
    elsif session[:state] == 'question_two' 
     session[:state] = 'question_one' 
    end 
    end 
end 

マイビューは、(名前付きquestion.html.erb)である

resources :question do 
    collection do 
     get :next_page 
    end 
end 

ただし、session[:state]は常にです、なぜ?

注:この質問は、Ruby on Railsがどのように機能するかに関するものであり、私はサイト自体の詳細の大部分を省略し、質問に関連するものだけを残しました。

+0

どのように 'resources:question'を' QuestionController'ではなく 'MyController'にルーティングしていますか?あなたは間違いなくここで正しいコントローラのアクションを打つのですか? – gwcodes

答えて

1

どのようにnext_page_pathをトリガーするのかわかりませんが、あなたが与えた情報を与えることで、質問パスにparam [:state]を設定し、それに基づいてセッションを設定できます。

def question 
    # session[:state] = 'semantic_recognition_state' 
    # not sure why you are setting 'semantice_recognition_state' 

    if params[:state].nil? && session[:state].nil? 
    session[:state] = 'question_one' 
    elsif params[:state].nil? && session[:state].present? 
    session[:state] 
    else 
    session[:state] = params[:state] 
    end 
end 


<div class="buttons"> 
    <%= link_to "Next", question_path(state: 'question_two'), class: "btn btn-large btn-primary" %> 
    <%= link_to "Back", question_path(state: 'question_one'), class: "btn btn-large btn-primary" %> 
</div> 
+0

**ローカル変数ではなくインスタンス変数でセッションを保存する必要があります。** OPは 'session'をローカル変数に保存していません。一度定義されると、アプリケーション間で 'session'値にアクセスすることができます。 – Pavan

+0

100%右私は問題を間違って見た。 –

+0

同上、私はそれを間違って見ていました。ありがとう! –

関連する問題