2013-05-14 61 views
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直接在控制器不会这样做。

+0

有问题吗? – 2013-05-14 16:04:41

回答

0

我想你正在使用设计。我看不出有任何的问题在这里,但也许你想要做的就是把你的应用程序控制器的以下内容:然后

before_filter :load_current_user 

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

@current_user将在所有的控制器访问。

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