0

我正在玩http://railscasts.com/episodes/250-authentication-from-scratch并在尝试进行一些重构时遇到了问题。

该应用程序只需设置以下内容即可登录用户:

session[:user_id] = user.id 

目前这位于控制器中。我只想在 User 对象上有两种方法。一种称为登录,一种称为注销。这意味着如果我更改登录的实现,那么只有一个地方可以更改代码,并且使其更具可读性。最简单的解决方案显然是将其添加到用户模型中:

def login
  session[:user_id] = user.id
end

众所周知,在 Rails 模型中无法访问会话。我们显然可以在应用程序控制器上创建这两个方法并传入用户对象,但这看起来有点难看,实现这个简单用例的推荐方法是什么?

4

3 回答 3

0

推荐的方法是不要将这样的代码放在模型中。

我意识到这并不能回答实际问题,但没有推荐的方法在模型中实现这一点。模型仅用于数据库访问,它们本身不应该用于与 http 会话进行交互。

识别和维护“current_user”是控制器的明确责任(在 MVC 模式中)。

于 2012-08-23T14:47:53.563 回答
0

一种选择是给用户一个可以登录/注销的类、类实例或过程。

用户类只需要调用一个类方法/proc,所有关于登录/注销发生的细节封装在类/proc中。

这也将登录/注销的想法与 Rails 隔离开来,因此可以在 GUI 应用程序(例如,JRuby/Swing)或命令行应用程序中使用相同的模型。这有多容易/多难也取决于您的模型。

于 2012-08-23T14:56:21.617 回答
0

也许你可以在模型中引发一个异常,并在 Controller 中使用rescue_from 捕获它。与您对 CanCan 所做的类似。

于 2013-05-15T02:10:46.033 回答