Rails- Ruby 实例变量

Rails- Ruby Instance Variable

所以我正在使用 omniauth-facebook 创建一个使用 Facebook 的登录。
这是我的 sessions_controller.rb

class SessionsController < ApplicationController

  def create
    user = User.from_omniauth(env["omniauth.auth"])
    session[:user_id] = user.id
    redirect_to "/sessions/menu"
  end

  def destroy
    session[:user_id] = nil
    redirect_to root_url
  end

  def new
  end

  def menu
      puts user.name
  end

end

很遗憾,我不知道如何在菜单操作中访问用户变量。你们会如何推荐我这样做?

更新

class SessionsController < ApplicationController

  def create
    @user = User.from_omniauth(env["omniauth.auth"])
    session[:user_id] = @user.id
    redirect_to "/sessions/menu"
  end

  def destroy
    session[:user_id] = nil
    redirect_to root_url
  end

  def new
  end

  def menu
      puts @user
  end

end

即使我这样更新它,它也不起作用

Unfortunately I don't know how to access the user variable in the menu action. How would you guys recommend I do this?

每次在您的应用中请求执行 SessionsController 中的操作时,都会创建 SessionsController 的新实例。因此,在调用 menu 操作请求时,在 create 操作期间设置的实例变量将不可用,因为现在您有一个 SessionsController 的新实例,这就是 @user 设置的原因create 操作在 menu 中不可用。此外,如果您在这种情况下使用 user 局部变量 ),那么它始终在其定义的 method/action 中。所以即使这样在 menu.

中也不可用

通过使用 facebook-omniauth gem 您将在 env["omniauth.auth"] 中收到 Auth Hash,然后您将使用它来创建(新用户)或初始化(如果是现有用户)一个希望用户使用 from_omniauth 方法。 注意: env 是特定于请求的,因此 env["omniauth.auth"] 值将出现在 create 操作中,但不会出现在 menu.[=36= 中]

要解决此问题,即要访问在 menu 操作中创建或初始化的 facebook user,您应该使用存储在 [=32= 中的 user_id ] 如下:

def menu
  if session[:user_id]
    @user = User.find(session[:user_id])
  end
end

此外,如果您还想在其他操作中访问用户,那么我建议您通过使用 before_action 回调来重用代码:

class SessionsController < ApplicationController

  ## Pass specific actions to "only" option
  before_action :set_user, only: [:menu, :action1, :action2]

  #...

  def menu
      puts @user.name
  end

  private

  def set_user
    if session[:user_id]
      @user = User.find(session[:user_id])
    end
  end
end

您可以在其中通过 :only 选项添加特定操作