2017-01-14 17 views
-1

メソッドのインスタンス変数@quizにアクセスできません。インスタンス変数を別のメソッドに渡すことができません

newメソッドに対応するビューで@quizにアクセスする必要があります。

@edit私はもう一度新しい方法で@quizによって問題を回避しようとしましたが、何らかの理由でparams[:session][:test_password]が空です。このコントローラで

class QuizzesController < ApplicationController 
    include UsersHelper 
    before_action :logged_in_user 

    def password_check 
    end 

    def forward 
    find_quiz 
    if @quiz 
     redirect_to new_quiz_path 
    else 
     redirect_to root_url 
     flash[:danger] = t(:invalid_test_password) 
    end 
    end 

    def new 
    @score = Score.new 
    end 

    private 

    def find_quiz 
     @quiz = Test.find_by(password: params[:session][:test_password]) 
    end 

end 

ルート:あなたがユーザーをリダイレクトする場合

quiz_password GET (/:locale)/quiz_password(.:format) quizzes#password_check {:locale=>/pl|en/} 
       POST (/:locale)/quiz_password(.:format) quizzes#forward {:locale=>/pl|en/} 
     quiz GET (/:locale)/quiz(.:format)   quizzes#new {:locale=>/pl|en/} 
+1

あなたの質問は不明です。実際には、あなたは質問することさえしていない、あなたは単に声明を出して、いくつかのコードを示しているだけです。あなたの質問は何ですか?間違いはありますか?はいの場合、それは何ですか?あなたは間違った出力を得ますか?はいの場合、それは何ですか、そして正しい出力は何ですか? –

答えて

0

私は誤ってparams[:session][:test_password]が変数をセッションに保存する正しい方法だと考えました。私は代わりにsession[:test_password] = params[:session][:test_password]を割り当てました。それはちょうどいい動作します。

class QuizzesController < ApplicationController 
    include UsersHelper 
    before_action :logged_in_user 

    def password_check 
    end 

    def forward 
    @quiz = Test.find_by(password: params[:session][:test_password]) 
    if @quiz 
     store_password 
     redirect_to quiz_path 
    else 
     redirect_to root_url 
     flash[:danger] = t(:invalid_test_password) 
    end 
    end 

    def new 
    find_quiz 
    @score = Score.new 
    end 

    private 

    def store_password 
     session[:test_password] = params[:session][:test_password] 
    end 

    def find_quiz 
     @quiz = Test.find_by(password: session[:test_password]) 
    end 

end 
0

、新しい要求が行われます。そのため、すべての変数が削除され、それらを再度作成する必要があります。

+0

私は 'new'メソッドで' @ user'変数を再作成しようとしましたが、何らかの理由で 'params [:session] [:test_password]'が空です。 – Kappa

+0

これは、2回目のリクエストでパラメータを再度送信する必要があるためです。 – MSathieu

+0

この方法のポイントは、この変数を次のビューに渡し、 'test_password'ユーザが何を入力するかに応じてビューを生成することです。だから私は本当にそれをすることはできません。 – Kappa

2

各リクエストは独立したActionControllerインスタンスによって処理されるので、1つのリクエストに設定されたインスタンス変数は、2つ目のリクエストが来るまでにゴミ箱に移動されることに注意してください。 session、ファイルシステム、または何らかの種類のデータベースのようなものでのみデータを保持することができます。あなたがここに何をすべき

は、あなたが既に持っている方法をより有効に活用される。

before_action :find_quiz, only: [ :forward, :new ] 

その後、手動でそのメソッドをトリガーする必要はありません、それは自動的にその行動に向けた各要求の前に発生します。そのメソッドが実行されると、その変数に値が設定されます。

+0

私はメインポストを編集している間にあなたが答えたことを知ります。編集した部分をお読みください。 – Kappa

+0

'new'メソッドは明示的にまたは暗黙的に' before_action'を介して 'find_quiz'を呼び出さないので問題があります。 – tadman

+0

実際にはありません。 'params [:session] [:test_password]'がリセットされているので、編集した部分に書きましたが、動作しませんでした。 – Kappa

関連する問題