2013-07-28 4 views
0

Я использую Devise и Omniauth. Итак, я должен иметь метод current_user, доступный в моих контроллерах. Действительно, например, в моем tasks_controller:Devise current_user найден в контроллере, но отсутствует в другом

def index 
    @tasks_remaining = Task.where(:user => current_user, :done => false) 
    @tasks_done = Task.where(:user => current_user, :done => true) 
    end 

current_user делает работу, как и ожидалось. Очень странно, RubyMine предупреждает меня, что current_user не найден и подчеркивает его серый. Но эта часть кода работает в любом случае.

Однако в моем authentications_controller,

def create 
    omniauth = request.env["omniauth.auth"] 
    authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid']) 
    if authentication 
     sign_in_and_redirect(:user, authentication.user) 
    else 
     current_user.authentications.create(:provider => ominauth['provider'], :uid => omniauth['uid']) 
     flash[:notice] = "success" 
     redirect_to authentication_url 
    end 
    end 

Здесь я получаю сообщение об ошибке, когда эта линия с current_user выполняет. Он говорит:

undefined method `authentications' for nil:NilClass 

Я отлажена до этой точки, и обнаружил, что current_user переменная действительно нет в этой области.

Итак, почему он работает в одном контроллере и отсутствует в другом? Я использую Rails 4 и рубин 2. Я следую Railscast 235 и 236.

+0

убедитесь, что вы используете 'authenticate_user!' В 'before_filter' на вашем контроллере. – manoj2411

ответ

2

ошибка не означает, что метод current_user, не найден возвращает ноль, потому что никто не будет подписан в.

def create 
    omniauth = request.env["omniauth.auth"] 
    authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid']) 
    if authentication 
    flash[:notice] = "Signed in successfully." 
    sign_in_and_redirect(:user, authentication.user) 
    elsif current_user 
    current_user.authentications.create!(:provider => omniauth['provider'], :uid => omniauth['uid']) 
    flash[:notice] = "Authentication successful." 
    redirect_to authentications_url 
    else 
    user = User.new 
    user.apply_omniauth(omniauth) 
    if user.save 
     flash[:notice] = "Signed in successfully." 
     sign_in_and_redirect(:user, user) 
    else 
     session[:omniauth] = omniauth.except('extra') 
     redirect_to new_user_registration_url 
    end 
    end 
end 

У вас есть письменное условие, подобное «elsif current_user» в вашем коде контроллера аутентификации?

как я вижу, вы скопировали этот код из railscasts omniauth # 1, я предлагаю посмотреть railscasts omniauth # 2.

+0

Привет @ sachin-петь да, я тоже смотрел вторую часть и обновлял свой код соответственно. Но все еще получаю эту ошибку. :( –

+0

@HasanIqbalAnik обновил свой ответ. –

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