Ruby on rails 没有路由匹配{:action=>;show";,:controller=>;members";,:id=>;nil}
我设置了twitter登录系统,得到了上面关于代码的错误消息Ruby on rails 没有路由匹配{:action=>;show";,:controller=>;members";,:id=>;nil},ruby-on-rails,ruby-on-rails-3,twitter,omniauth,Ruby On Rails,Ruby On Rails 3,Twitter,Omniauth,我设置了twitter登录系统,得到了上面关于代码的错误消息 redirect_to member_path(session[:user_id]), :notice => "#{auth["info"]["name"]}さんの#{auth["provider"]}アカウントと接続しました。" 在sessions_controller.rb的def回调中。我想知道为什么会发生这种情况,因为我用omniauth gem设置facebook登录时从未发生过。你能告诉我为什么会发生这种情况以及
redirect_to member_path(session[:user_id]), :notice => "#{auth["info"]["name"]}さんの#{auth["provider"]}アカウントと接続しました。"
在sessions_controller.rb的def回调中。我想知道为什么会发生这种情况,因为我用omniauth gem设置facebook登录时从未发生过。你能告诉我为什么会发生这种情况以及如何解决这个问题吗
我检查了一些元素。通过twitter登录创建了一个新用户。我可以得到“会话”。但无法获取会话[:user\u 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
☆会话控制器
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
您的问题是,您试图为成员构建需要
id
的成员路由。换句话说,Rails应该构建像/members/:id
这样的路由,其中id必须是一个数字。当您将会话[:id]
(为零!)传递给route helper成员\u path
时,您会收到一个错误
怎么办
1) (如果您使用gem进行身份验证,例如designe
),则可以传递给路由助手current\u user
:memeber\u path(current\u user)
2) 如果您有自己的用户身份验证方法,您可以自行设置session[:user\u id]
。
我想问题出在别处。因此,您可以在创建新成员后定义会话[user\u id
]。我希望该方法Member.create\u with\u 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
您是否使用任何gem进行身份验证?我使用的是omuniauth gem。非常感谢。gem'omniauth'gem'omniauth facebook'omniauth-twitter'谢谢你的评论。你能告诉我如何在这个设置中自己设置会话[:user_id]吗?gotva先生,非常感谢!!多亏了你,我成功了!!
redirect_to member_path(session[:user_id]) if session[:user_id]