我设置了Twitter登录系统,并在代码
周围收到了上面的错误消息 redirect_to member_path(session[:user_id]), :notice => "#{auth["info"]["name"]}さんの#{auth["provider"]}アカウントと接続しました。"
<_>在sessions_controller.rb的def回调中。我想知道为什么会发生这种情况,因为当我使用omniauth gem设置facebook登录时从未发生过这种情况。你能告诉我为什么会发生这种情况以及如何解决这个问题吗?
我查了一些元素。通过Twitter登录创建了一个新用户。我可以得到“会话”。但是无法获得会话[:user_id]。
☆member.rb
def self.create_with_omniauth(auth)
create! do |member|
member.provider = auth["provider"]
member.uid = auth["uid"]
member.mail = auth["mail"]
member.image = auth["info"]["image"]
if member.provider == "facebook"
member.name = auth["info"]["name"]
else
member.name = auth["info"]["nickname"]
end
end
end
☆sessions_controller
def callback
#omniauth.auth環境変数を取得
auth = request.env["omniauth.auth"]
#Userモデルを検索
member = Member.find_by_provider_and_uid(auth["provider"], auth["uid"])
if member
# 既存のユーザ情報があった場合ルートに遷移させます
session[:user_id] = member.id
redirect_to member_path(session[:user_id]), :notice => "ログインしました。"
else
# Userモデルに:providerと:uidが無い場合(外部認証していない)、保存してからルートへ遷移させる
Member.create_with_omniauth(auth)
redirect_to member_path(session[:user_id]), :notice => "#{auth["info"]["name"]}さんの#{auth["provider"]}アカウントと接続しました。"
end
end
答案 0 :(得分:1)
您的问题是您尝试为成员构建需要id
的成员路由。换句话说,Rails应该构建像/members/:id
这样的路由,其中id必须是一个数字。当您将session[:id]
(这是零!)传递给路线助手member_path
时,您会收到错误。
怎么办?
1)(如果您使用gem进行身份验证,例如devise
),您可以传递给路由助手current_user
:memeber_path(current_user)
2)如果您有自己的方法来验证用户,您可以自己设置session[:user_id]
。
我想问题是在else-block中。因此,您可以在创建新成员后定义会话[user_id
]。我希望方法Member.create_with_omniauth(auth)
返回一个新成员 - 这意味着你需要使用它的id
if member
# 既存のユーザ情報があった場合ルートに遷移させます
session[:user_id] = member.id
redirect_to member_path(session[:user_id]), :notice => "ログインしました。"
else
# Userモデルに:providerと:uidが無い場合(外部認証していない)、保存してからルートへ遷移させる
session[:user_id] = Member.create_with_omniauth(auth).id # <--- UPDATED PART IS HERE
redirect_to member_path(session[:user_id]), :notice => "#{auth["info"]["name"]}さんの#{auth["provider"]}アカウントと接続しました。"
end
PS
无论如何,如果session[:user_id]
为nil
redirect_to member_path(session[:user_id]) if session[:user_id]