0

我有一个帮助模块:

module SessionsHelper
  @current_user
  @current_session

  def current_user
    @current_user = User.find(cookies[:user_id]) if(cookies[:user_id])
  end

  def current_session
    @current_session = Session.find_by_secret_key(cookies[:session_secret_key])
  end

  def current_user=(user)
    @current_user = user
  end

  def current_session=(session)
    @current_session = session
  end
end

和一个控制器:

class SessionsController < ApplicationController
  include SessionsHelper
  respond_to :json

  def create
    u = User.find_by_ip(request.remote_ip)
    u = User.create({:ip => request.remote_ip}) unless u

    s = Session.create
    s.admin = u
    s.save!

    send(:current_user=,u)
    send(:current_session=,s)

    respond_with s
  end
end

请注意我必须如何使用该:send方法设置当前用户,因为直接在控制器中调用current_user=u不会这样做。

4

2 回答 2

0

直接调用current_user应该可以工作,但是您需要使用self显式接收器

def create
  u = User.find_by_ip(request.remote_ip)
  u = User.create({:ip => request.remote_ip}) unless u

  s = Session.create
  s.admin = u
  s.save!

  self.current_user = u
  self.current_session = s

  respond_with s
end

否则,下面的代码将设置一个局部方法变量

def create
  u = User.find_by_ip(request.remote_ip)
  u = User.create({:ip => request.remote_ip}) unless u

  s = Session.create
  s.admin = u
  s.save!

  current_user = u
  current_session = s

  respond_with s
end

作为旁注,您可能希望使用有意义的变量名。

def create
  user = User.find_by_ip(request.remote_ip) || User.create(:ip => request.remote_ip)

  session = Session.create
  session.admin = user
  session.save!

  self.current_user = user
  self.current_session = session

  respond_with session
end
于 2013-05-14T16:15:11.543 回答
0

我猜你正在使用设计。我在这里看不到任何问题,但也许您想要做的是将以下内容放入您的应用程序控制器中:

before_filter :load_current_user

def load_current_user
  @current_user = User.find(session[:user_id]) if(session[:user_id])
end

然后,您的所有控制器都可以访问 @current_user。

于 2013-05-14T16:11:12.583 回答