我正在玩http://railscasts.com/episodes/250-authentication-from-scratch并在尝试做一点重构时碰到了问题。
应用程序只需设置:
即可记录用户session[:user_id] = user.id
目前,它位于控制器中。我只想在User对象上有两个方法。一个叫登录,一个叫登出。这意味着如果我更改了登录的实现,那么只有一个地方可以更改代码,并且使其更具可读性。最简单的解决方案显然是将其添加到用户模型中:
def login
session[:user_id] = user.id
end
众所周知,在rails模型中无法访问会话。我们显然可以在应用程序控制器上创建两个方法并传入用户对象,但这看起来有点难看,推荐的实现这个简单用例的方法是什么?
答案 0 :(得分:0)
建议的方法是不要在模型中放置类似的代码。
我意识到这并没有回答实际问题,但没有推荐的方法在模型中实现这一点。模型仅用于数据库访问,它们不应用于与http会话进行交互。
识别和维护'current_user'是控制器的明确责任(在MVC模式中)。
答案 1 :(得分:0)
一个选项是为User提供可以登录/注销的类,类实例或proc。
用户类只需调用类方法/ proc,所有关于 登录/注销发生的详细信息都封装在类/ proc中。
这也将登录/注销想法与Rails隔离开来,因此可以从GUI应用程序(例如,JRuby / Swing)或命令行应用程序使用相同的模型。这有多容易/困难取决于您的模型。
答案 2 :(得分:0)
也许您可以在模型中引发异常并使用rescue_from在Controller中捕获它。与您对CanCan的操作类似。