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)
即使我像这样更新它,它也行不通
不幸的是我不知道如何在菜单操作中访问用户变量.你们怎么建议我这样做?
每次在您的应用中请求操作时SessionsController,SessionsController都会创建一个新实例.因此,create当menu调用操作请求时,操作期间设置的实例变量将不可用,因为现在您有一个新实例,SessionsController这就是为什么@user设置create不起作用的原因menu.另外,如果你在这种情况下使用user(局部变量),那么它总是在其定义的方法/动作的本地.所以,即使这样也无法获得menu.
通过使用facebook-omniauthgem,您将收到Auth Hash,env["omniauth.auth"]其中您将使用创建(新用户)或初始化(在现有用户的情况下)用户希望在from_omniauth方法中.
注意: env是特定env["omniauth.auth"]于请求的,因此值将在create操作中出现但不在menu.
为了解决这个问题,即,访问创建或初始化的Facebook user在menu行动,你应该使用的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选项添加特定操作的位置
| 归档时间: |
|
| 查看次数: |
109 次 |
| 最近记录: |