Ruby on rails 没有路由匹配{:action=>;show";,:controller=>;members";,:id=>;nil}

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登录时从未发生过。你能告诉我为什么会发生这种情况以及

我设置了twitter登录系统,得到了上面关于代码的错误消息

 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]