2013-12-06 2 views
0

Я установить твиттер систему входа и получил сообщение об ошибке выше вокруг кодовНет маршрута матчей {: действие => «показать»,: контроллер => «члены»,: идентификатор => NIL}

redirect_to member_path(session[:user_id]), :notice => "#{auth["info"]["name"]}さんの#{auth["provider"]}アカウントと接続しました。" 

в def обратном вызове session_controller.rb. Интересно, почему это произошло из-за того, что этого не произошло, когда я установил логин facebook с помощью gem. Как вы могли бы рассказать мне, почему это произошло и как это решить?

Я проверил некоторые элементы. Новый пользователь был создан через вход в 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

сделать вы используете любой камень для аутентификации? – gotva

+0

Я использую драгоценный камень omuniauth. Спасибо. gem 'omniauth' gem 'omniauth-facebook' 'omniauth-twitter' –

ответ

1

Ваша проблема заключается в том, что вы пытаетесь построить маршрут члена, который требует id для члена. Другие слова Rails должны строить маршруты, такие как /members/:id, где id ДОЛЖЕН быть числом. Когда вы пройдете session[:id] (что равно нулю!) К помощнику маршрута member_path вы получите сообщение об ошибке.

Что делать?

1) (если вы используете камень для аутентификации, например devise) вы можете перейти к помощнику маршруту current_user: memeber_path(current_user)

2) если у вас есть собственный метод, который аутентификация пользователя, вы можете установить session[:user_id] самостоятельно, вы. Я полагаю, что проблема в другом блоке. Таким образом, вы можете определить сеанс [user_id] после создания нового пользователя. Я надеюсь, что метод Member.create_with_omniauth(auth) возвращает новый элемент - это значит, что вам нужно взять его идентификатор

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] равна нулю

redirect_to member_path(session[:user_id]) if session[:user_id] 
+0

Спасибо за ваш комментарий. Не могли бы вы рассказать мне, как настроить сеанс [: user_id] самостоятельно в этой настройке? –

+0

Я обновляю ответ – gotva

+0

Mr.gotva, спасибо вам большое! Спасибо вам, я сделал это! –

Смежные вопросы