我可以在模型中访问会话吗?为什么这么糟糕?

时间:2014-08-21 15:53:29

标签: ruby-on-rails

我以为我可以在我的用户模型中执行此操作:

def sign_in
    remember_token = self.generate_remember_token
    self.update_attributes remember_token: remember_token
    session[:remember_token] = remember_token
end

然后在会话控制器中执行此操作:

def create
    @user = User.find_by email: session_params[:email]
    if @user && @user.authenticate session_params[:password]
        @user.sign_in
    end
end

对我来说,这看起来很好,干净整洁。看起来很糟糕,让控制器变瘦并使模型变得肥胖。

但是这段代码不起作用,因为我收到了这个错误:

undefined local variable or method `session' for #<User:0x00000004e4c510>

似乎Rails不是从模型访问会话的方式。

  • 但为什么?真的那么糟糕吗?

  • 如何在模型中访问会话?

  • 以上是如何违反MVC的?是因为模型正在改变数据库以外的东西吗?而模型应该只编辑 数据库?除此之外,它并没有违反MVC ...

  • 这个认证机制应该去哪里? sessions_controller中的私有方法?

1 个答案:

答案 0 :(得分:2)

  

但为什么呢?真的那么糟糕吗?

     

如何在模型中访问会话?

如果您查看错误,请清楚解释

  

未定义的局部变量或方法`session&#39;对于#

您无法在模型中使用会话,因为会话方法已在Action Controller 中定义,并且因为您的控制器继承自应用程序控制器,因此它可用在控制器中

  

以上是如何违反MVC的?是因为模型正在改变数据库以外的东西吗?模型应该只编辑数据库?除此之外,它并没有违反MVC ......

是的,你是对的模型用于查询数据库并在会话中存储一些值似乎更像是一个动作,这就是控制器的用途。

  

这种认证机制应该去哪里? sessions_controller中的私有方法?

正如@japed建议你可以做的是从你的方法中返回你的remember_token,然后在控制器中设置它:

def create
  @user = User.find_by email: session_params[:email]
  if @user && @user.authenticate session_params[:password]
    session[:remember_token] = @user.sign_in
  end
end

def sign_in
  remember_token = self.generate_remember_token
  self.update_attributes remember_token: remember_token
  return remember_token
end