没有路线匹配{:action =>“show”,:controller =>“members”,:id => nil}

时间:2013-12-06 16:53:21

标签: 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登录时从未发生过这种情况。你能告诉我为什么会发生这种情况以及如何解决这个问题吗?

我查了一些元素。通过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

1 个答案:

答案 0 :(得分:1)

您的问题是您尝试为成员构建需要id的成员路由。换句话说,Rails应该构建像/members/:id这样的路由,其中​​id必须是一个数字。当您将session[:id](这是零!)传递给路线助手member_path时,您会收到错误。

怎么办?

1)(如果您使用gem进行身份验证,例如devise),您可以传递给路由助手current_usermemeber_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]