railsstutorial.org中的SessionsHelper:帮助者应该是视图中不需要的代码的通用模块吗?

Cra*_*ntz 19 ruby encapsulation ruby-on-rails helpers railstutorial.org

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

它建议这段代码:

class ApplicationController < ActionController::Base 
  protect_from_forgery 
  include SessionsHelper 
end 
Run Code Online (Sandbox Code Playgroud)

include SessionsHelper使得可从方法ApplicationController,是的,但它使他们在任何视图中可用,以及.我知道认证/授权是跨领域的,但这真的是最好的地方吗?

在我看来,这似乎可能过于宽泛.将实现(例如,before_filter有条件地重定向)的代码(如railstutorial.org示例所示)放在一个更常见的包含视图助手的模块中似乎令人惊讶.

在视图中不严格需要的功能是否可以更好地放在ApplicationController或其他地方?

或者我只是在考虑这个问题?

nat*_*vda 20

的确,你的感觉是正确的.

我会实现这个周围的其他方法:添加的功能sign_incurrent_userApplicationController(或者,如果你真的想:在一个单独的模块中定义lib的,包括它),然后确保该current_user方法可在视图中.

简而言之:

class ApplicationController

  helper_method :current_user

  def sign_in

  end

  def current_user
    @current_user ||= user_from_remember_token
  end
end
Run Code Online (Sandbox Code Playgroud)

当然,如果你有很多代码放入你的ApplicationController内容会变得混乱.在那种情况下,我会创建一个文件lib\session_management.rb:

module SessionManagement
  def self.included(base)
    base.helper_method :current_user
  end

  def sign_in
    ..
  end

  def current_user
    ..
  end
end
Run Code Online (Sandbox Code Playgroud)

然后在你的控制器内你可以写:

class ApplicationController
  include SessionManagement
end
Run Code Online (Sandbox Code Playgroud)

  • 位于`app/helpers`下的助手文件会自动包含在视图中.因此,期望包含简单的视图功能.这就是为什么我建议将它放在一个单独的模块中:它不仅包含视图功能.在rails 4术语中,这个appraoch已经正式化:它们现在被称为"关注点". (2认同)

小智 6

他们似乎采取(偷偷摸摸)优势,在Rails中,助手只是红宝石模块.

在我看来,放置在模块中的控制器之间共享的行为是一种很好的做法.另一方面,将它放在助手中可能会产生误导,我会避免它.将其放在"标准"模块中.