Versun

对待生命,不妨大胆一点,因为我们终将失去它


created: 2024-10-12, updated: 2025-02-08

Rails的helper_method和Concern

今天在做用户认证时,在控制器中一直用authenticated?来判断用户是否登陆,但一直不成功。

查了下,发现authenticated?Authentication Concern的helper_method方法,
而helper_method是暴露给view层使用的,在其它控制器中是不能直接使用的,
需要在控制器的class下include Authentication才可以使用


Conern是Rails非常有用的一个概念,在以前,我经常会写多重继承的代码,
比如“大象”类继承“哺乳动物”类,而“哺乳动物”类又继承自“动物园”类,
这时候为了兼容,很容易出现“动物园”类里有很多“大象”类和“哺乳动物”类所不需要的方法,
这就造成代码重用性的问题,而且也不容易维护。
而Conern允许将共享的代码逻辑封装到单独的可重用的模块中,通常存放在 app/models/concernsapp/controllers/concerns 目录下,
然后在需要使用这个 Concern 的类中,使用 include关键字导入就行了

class SomeController < ApplicationController
  include Authentication

  # 现在可以使用 Authentication 中定义的方法和回调
end

比如“哺乳动物”类就可以作为一个Conern,“大象”类直接继承自“动物园”类,但可以在“大象”类里include “哺乳动物”类来使用需要的方法。

有点像 接口/协议 的概念,但接口/协议主要是定义/签名,不一定有方法的实现,而Conern直接提供方法的实现,更注重代码的重用性,其它不用考虑