繁体   English   中英

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

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

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

一个请求在您的应用程式的行为使每次SessionsController的的新实例SessionsController创建。 因此,当调用menu操作请求时,在create操作期间设置的实例变量将不可用,因为现在您有了SessionsController的新实例,这就是为什么在create action中设置的@usermenu不可用的原因。 另外,如果在这种情况下使用user局部变量 ),则它始终位于定义其的方法/操作的局部。 因此,即使在menu也不可用。

通过使用facebook-omniauth gem,您将在env["omniauth.auth"]收到facebook-omniauth验证哈希,而您又可以希望使用from_omniauth方法来创建(新用户)或初始化(如果存在现有用户)用户。 注意: env是特定于请求的,因此env["omniauth.auth"]值将出现在create动作中,但不会出现在menu

要解决此问题,即在menu操作中访问已创建或初始化的facebook user ,应使用存储在session中的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选项添加特定操作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM