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

时间:2017-01-14 18:58:34

标签: ruby-on-rails ruby variables controller instance

我无法访问@quiz方法中的new实例变量。

我需要在与@quiz方法相对应的视图中访问new

@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/}

3 个答案:

答案 0 :(得分:2)

请记住,每个请求都由一个独立的ActionController实例处理,因此在一个请求上设置的任何实例变量将在第二个请求到达时被删除。您只能在session,文件系统或某种数据库等内容中保留数据。

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我错误地认为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 而且工作得很好

<fetch mapping="logical" distinct="true">
   <entity name="entity">
      <attribute name="new_classopportunityid" />
      <attribute name="new_trainingproduct" />
      <attribute name="new_gtgstatus" />
      <attribute name="new_scheduledstartdate" />
      <attribute name="new_scheduledenddate" />
      <attribute name="new_remainingnumberofseats" />
      <attribute name="new_liveclassroom" />
      <attribute name="new_maxlive" />
      <attribute name="new_xavieruniversity" />
      <attribute name="new_partnerlive" />
      <attribute name="new_blended" />
      <filter>
         <condition attribute="new_classopportunityid" operator="in">
            <value>001943ea-e263-e611-8158-00155d002810</value>
            <value>0071e4ea-bd9b-e611-8163-00155d002810</value>
            <value>00c32774-1c8f-e611-8161-00155d002810</value>
            <value>00d513fa-f0bb-e611-8169-00155d002810</value>
            <value>....</value>
            <value>....</value>
            <value>....</value>
         </condition>
      </filter>
   </entity>
</fetch>