无法将实例变量传递给另一个方法

Can't pass instance variable to another method

我无法在 new 方法中访问 @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/}

如果您重定向用户,则会发出新请求。因此,所有变量都将被删除,您将需要重新创建它们。

请记住,每个请求都由一个独立的 ActionController 实例处理,因此在一个请求上设置的任何实例变量都将在第二个请求出现时被丢弃。您只能将数据保存在 session、文件系统或某种数据库中。

在这里你应该做的是更好地利用你已有的方法:

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

那么就不需要手动触发该方法,它会在每个指向该操作的请求之前自动触发。当该方法运行时,该变量将被填充。

我错误地认为 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