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
选项添加特定操作
所以我正在使用 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
选项添加特定操作