Как получить доступ к переменным сеанса через несколько контроллеров в Rails? - PullRequest
1 голос
/ 17 апреля 2011

Я установил соединение Facebook для своего приложения. Поэтому, когда пользователь входит в систему, я хочу сохранить его идентификатор Facebook в сеансе и использовать его для нескольких контроллеров и представлений. Я пытался реализовать это. Я также сослался на несколько похожих вопросов, на которые отвечал stackoverflow Однако что-то кажется неправильным. Я установил идентификатор Facebook в сессии в UserController. Я не могу получить к нему доступ в EventsController.

Поток: Когда пользователь входит в систему в первый раз. Fbinsertupdate называется. Затем страница перенаправляется на страницу событий # index.

class User < ActiveRecord::Base

 def self.current=(u)
@current_user = u
end

def self.current
@current_user
end


end





class ApplicationController < ActionController::Base
  protect_from_forgery



  # Finds the User with the ID stored in the session with the key
  # :fb_user_id 

  def current_user
    User.current  ||= session[:fb_user_id] &&
      User.find(session[:fb_user_id])
  end


end




class UsersController < ApplicationController



  def fbinsertupdate  #Facebook connect. Insert new user or update existing user


    @user = User.find_or_create_by_fbid(params[:fbid]) 
    @user.update_attributes(params[:user])
    session[:fb_user_id] = @user.fbid  # storing the facebook id in the session
    render :nothing => true




  end



end


class EventsController < ApplicationController

  def index
     @events = Event.all
     @current_user= User.current
    logger.debug "The current user is  "+@current_user.name  # This fails . Says the class in nil

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @events }
    end
  end


end

1 Ответ

1 голос
/ 17 апреля 2011

Отсутствует ли before_filter?Похоже, вы вообще не вызываете метод current_user (который читает сеанс).Я вижу два способа исправить это:

Либо используйте before_filter: вверху вашей EventsController записи

class EventsController < ApplicationController

  before_filter :current_user 

  def index
    @events = Event.all
    @current_user= User.current
    logger.debug "The current user is  "+@current_user.name  # This fails . Says the class in nil

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @events }
    end
  end
end

, либо вы измените свой index -код какследует:

  def index
    @events = Event.all
    @current_user= current_user
    logger.debug "The current user is  "+@current_user.name  # This fails . Says the class in nil

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @events }
    end
  end

Обратите внимание, что если вы используете API, используете rest / soap, сеанса нет и вам придется возвращать информацию (например, xml или json), которую затем можно передатьвместе в следующем вызове.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...