2015-03-24 3 views
1

Поэтому я использую omniauth-facebook для создания журнала с использованием Facebook.
Вот мой sessions_controller.rbRails-Ruby Instance Variable

class SessionsController < ApplicationController 

    def create 
    user = User.from_omniauth(env["omniauth.auth"]) 
    session[:user_id] = user.id 
    redirect_to "/sessions/menu" 
    end 

    def destroy 
    session[:user_id] = nil 
    redirect_to root_url 
    end 

    def new 
    end 

    def menu 
     puts user.name 
    end 

end 

К сожалению, я не знаю, как получить доступ к пользовательской переменной в действии меню. Как вы, ребята, порекомендуете мне это сделать?

Update

class SessionsController < ApplicationController 

    def create 
    @user = User.from_omniauth(env["omniauth.auth"]) 
    session[:user_id] = @user.id 
    redirect_to "/sessions/menu" 
    end 

    def destroy 
    session[:user_id] = nil 
    redirect_to root_url 
    end 

    def new 
    end 

    def menu 
     puts @user 
    end 

end 

Даже когда я обновляю его, как это так, он не работает

+1

сделать это _ivar_ как '@ user' ... –

+1

Только одно действие в контроллере срабатывает одновременно, после того как маршрутизатор создает экземпляр этого контроллера для заданного маршрута. В результате '@ user' или любая другая переменная, будь то переменная экземпляра или локальная, не будет определена в действии вашего меню, если вы не присвоите ей значение. –

+0

@JakeShorty Да, это причина .. –

ответ

5

К сожалению, я не знаю, как получить доступ к пользовательской переменной в действии меню , Как вы, ребята, порекомендуете мне это сделать?

Каждый раз, когда запрос сделан в приложении для действий в SessionsController, новый экземпляр SessionsController создается. Таким образом, переменная экземпляра, установленная во время действия create, не будет доступна, когда запрос на действие menu вызывается как теперь у вас есть новый экземпляр SessionsController, поэтому @user, установленный в create, действие не будет доступно в menu. Кроме того, если вы используете user (локальная переменная) в этом случае, то она всегда локальна для метода/действия, в котором оно определено. Поэтому даже это не будет доступно в menu.

Используя facebook-omniauth жемчужину вы получите Auth Hash в env["omniauth.auth"], который в свою очередь, вы будете использовать для создания (новый пользователь) или инициализировать (в случае существующего пользователя) пользователя, мы надеемся, в from_omniauth методе. ПРИМЕЧАНИЕ:env - это запрос, поэтому env["omniauth.auth"] значение будет присутствовать в create действии, но не в menu.

Чтобы решить эту проблему, то есть, чтобы получить доступ к использованию создаются или инициализируются фейсбук user в menu действий, вы должны сделать из user_id, хранящихся в session, как показано ниже:

def menu 
    if session[:user_id] 
    @user = User.find(session[:user_id]) 
    end 
end 

Кроме того, если вы хотели бы чтобы получить доступ к пользователю в других действиях, а то я бы рекомендовал повторно использовать код, используя функцию обратного вызова before_action:

class SessionsController < ApplicationController 

    ## Pass specific actions to "only" option 
    before_action :set_user, only: [:menu, :action1, :action2] 

    #... 

    def menu 
     puts @user.name 
    end 

    private 

    def set_user 
    if session[:user_id] 
     @user = User.find(session[:user_id]) 
    end 
    end 
end 

, где вы можете добавить конкретные действия по :only опция

+0

Зачем нужна опция ': only'? –

+0

Правда. Поскольку ОП не упоминал такие вещи, вот почему я не заботился об этом. Но, похоже, вы много раз использовали Gem в своей работе, поэтому с первого шанса вы подняли. Отличная работа. Возможность дает людям платформу, чтобы стать идеальной ... +1 –

+0

Хм, ... Этот Q был для меня «Доброе утро» Q .. Так пропустил это.: D ты знаешь мою привычку ..: D –

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