Rails- Ruby实例变量

idu*_*ude 1 ruby variables facebook ruby-on-rails omniauth

所以我使用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
Run Code Online (Sandbox Code Playgroud)

不幸的是我不知道如何在菜单操作中访问用户变量.你们怎么建议我这样做?

更新

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
Run Code Online (Sandbox Code Playgroud)

即使我像这样更新它,它也行不通

Kir*_*rat 5

不幸的是我不知道如何在菜单操作中访问用户变量.你们怎么建议我这样做?

每次在您的应用中请求操作时SessionsController,SessionsController都会创建一个新实例.因此,createmenu调用操作请求时,操作期间设置的实例变量将不可用,因为现在您有一个新实例,SessionsController这就是为什么@user设置create不起作用的原因menu.另外,如果你在这种情况下使用user(局部变量),那么它总是在其定义的方法/动作的本地.所以,即使这样也无法获得menu.

通过使用facebook-omniauthgem,您将收到Auth Hash,env["omniauth.auth"]其中您将使用创建(新用户)或初始化(在现有用户的情况下)用户希望在from_omniauth方法中. 注意: env是特定env["omniauth.auth"]于请求的,因此值将在create操作中出现但不在menu.

为了解决这个问题,即,访问创建或初始化的Facebook usermenu行动,你应该使用的user_id,你保存在session如下图所示:

def menu
  if session[:user_id]
    @user = User.find(session[:user_id])
  end
end
Run Code Online (Sandbox Code Playgroud)

此外,如果您还想在其他操作中访问该用户,那么我建议使用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
Run Code Online (Sandbox Code Playgroud)

您可以通过:only选项添加特定操作的位置