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_in和current_user对ApplicationController(或者,如果你真的想:在一个单独的模块中定义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)
小智 6
他们似乎采取(偷偷摸摸)优势,在Rails中,助手只是红宝石模块.
在我看来,放置在模块中的控制器之间共享的行为是一种很好的做法.另一方面,将它放在助手中可能会产生误导,我会避免它.将其放在"标准"模块中.
| 归档时间: |
|
| 查看次数: |
4789 次 |
| 最近记录: |