首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Railstutorial.org中的SessionsHelper : helpers应该是视图中不需要的代码的通用模块吗?

Railstutorial.org中的SessionsHelper : helpers应该是视图中不需要的代码的通用模块吗?
EN

Stack Overflow用户
提问于 2011-03-31 21:07:13
回答 2查看 4.9K关注 0票数 19

railstutorial.org有一个建议,让我觉得有点奇怪。

It suggests this code

代码语言:javascript
复制
class ApplicationController < ActionController::Base 
  protect_from_forgery 
  include SessionsHelper 
end 

是的,include SessionsHelper使这些方法在ApplicationController中可用,但它也使它们在任何视图中都可用。我知道身份验证/授权是交叉的,但这真的是最好的地方吗?

在我看来,这可能是一个过于宽泛的范围。将实现有条件重定向(如railstutorial.org示例)的before_filter的代码放在通常包含视图帮助器的模块中似乎很奇怪。

在视图中并不严格需要的功能放在ApplicationController或其他地方会更好吗?

还是我想得太多了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-20 04:51:00

事实上,你的感觉是正确的。

我会以另一种方式实现这一点:将函数sign_incurrent_user添加到ApplicationController中(或者,如果您真想这样做的话:在lib中定义的单独模块中并包含它),然后确保current_user方法在视图中可用。

简而言之:

代码语言:javascript
复制
class ApplicationController

  helper_method :current_user

  def sign_in

  end

  def current_user
    @current_user ||= user_from_remember_token
  end
end

当然,如果您有很多代码要放到ApplicationController中,它可能会变得杂乱无章。在这种情况下,我将创建一个文件lib\session_management.rb

代码语言:javascript
复制
module SessionManagement
  def self.included(base)
    base.helper_method :current_user
  end

  def sign_in
    ..
  end

  def current_user
    ..
  end
end

在你的控制器中,你可以这样写:

代码语言:javascript
复制
class ApplicationController
  include SessionManagement
end
票数 20
EN

Stack Overflow用户

发布于 2011-05-25 11:30:04

FWIW,我将当前用户存储在user类中:

代码语言:javascript
复制
class User < ActiveRecord::Base
  cattr_accessor :current
  ...
end

这可以在所有3个MVC层中引用;它在控制器中是这样设置的(当然,登录时也是如此):

代码语言:javascript
复制
def set_current_user
  User.current = (session[:user_id]) ? User.find_by_id(session[:user_id]) : nil
end

除了其他功能之外,这还允许我拥有ActiveRecord级别的审计日志,以捕获当前用户(如果适用)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5500322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档