我有一个辅助模块:
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
将无法执行此操作。
答案 0 :(得分:0)
我猜你正在使用设计。我在这里没有看到任何问题,但也许您想要做的是将以下内容放在您的应用程序控制器中:
before_filter :load_current_user
def load_current_user
@current_user = User.find(session[:user_id]) if(session[:user_id])
end
然后可以在所有控制器中访问@current_user。
答案 1 :(得分: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