如何在Rails 6中为Array类编写自定义except方法?
这个问题我之前也碰到过,放在Helper里确实行不通——毕竟Helper模块的作用域和核心类扩展的逻辑完全不一样。下面给你两种可行的解决办法,优先推荐第一种:
解决方法一:使用Rails初始化器(推荐)
Rails的config/initializers目录下的文件会在应用启动时自动加载,是扩展Ruby核心类(比如Array)的标准方式。具体步骤:
- 在你的Rails项目中创建文件
config/initializers/array_extensions.rb - 将你的扩展代码放进这个文件里:
class Array def except(value) self - [value].flatten end end
- 重启你的Rails服务器,之后不管是在控制器、模型还是视图里,所有Array实例都能调用
except方法了。
举个使用例子:
[1, 2, 3, 2].except(2) # => [1, 3] [1, 2, 3, 4].except([2, 4]) # => [1, 3]
为什么放在Helper里不行?
Helper模块是给视图和控制器提供辅助方法的,它的方法会被混入到视图上下文或者控制器实例中,而不是直接修改Array类的原型。所以你在Helper里定义的方法,只能在Helper的作用域里调用,没法直接在数组实例上使用。
可选方案:使用Ruby Refinements(非全局扩展)
如果你不想全局修改所有Array实例,可以用Ruby的Refinements来限定扩展的作用域。比如在某个模型或控制器里:
module ArrayExtensions refine Array do def except(value) self - [value].flatten end end end # 在需要使用的地方激活这个refinement using ArrayExtensions [1,2,3].except(2) # => [1,3]
这种方式下,except方法只会在激活了refinement的作用域内可用,不会影响全局的Array类。
内容的提问来源于stack exchange,提问作者user12608817
相关产品推荐
相关产品推荐

