无法将实例变量传递给另一个方法
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
我无法在 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