使用 ActiveSupport::Concern 功能时,如何通过将“嵌套”模块包含为该类的实例方法来将方法添加到类中?

2024-04-01

我正在使用 Ruby 1.9.2 和 Ruby on Rails v3.2.2 gem。在我上一个问题之后使用 Ruby on Rails ActiveSupport::Concern 功能时如何“嵌​​套”模块的包含 https://stackoverflow.com/questions/13110306/how-to-nest-the-inclusion-of-modules-when-using-the-ruby-on-rails-activesuppor,我想了解我应该在哪里通过包含“嵌套”模块来声明添加到类中的方法,以便使这些实例方法那个班级的。也就是说,我有以下内容:

class MyClass < ActiveRecord::Base
  include MyModuleA
end

module MyModuleA
  extend ActiveSupport::Concern

  included do
    include MyModuleB
  end
end

module MyModuleB
  extend ActiveSupport::Concern

  included do
    # def my_method
    #   ...
    # end
  end

  # def my_method
  #   ...
  # end
end

Should我声明def my_method ... end在“主体”/“上下文”/“范围”中MyModuleB或者我应该指出included do ... end block? 有什么区别以及我应该从中期待什么?


混合到类中的模块中的方法成为该类的实例方法。当将它们放入includedblock 可能会起作用,但没有必要这样做。通过扩展,这适用于模块,因为您可以包括ModuleB in ModuleA并且它的所有实例方法都成为实例方法ModuleA,还有一次ModuleA包含在课程中Foo,它的所有实例方法(包括那些混合在 fromB) 成为 Foo 上的实例方法。

“传统”混合看起来像这样:

module Mixin
  def self.included(klass)
    klass.send :extend, ClassMethods
    klass.some_class_method
  end

  module ClassMethods
    def some_class_method
      puts "I am a class method on #{self.inspect}"
    end
  end

  def some_instance_method
    puts "I am an instance method on #{self.inspect}"
  end
end

class Foo
  include Mixin
end

Foo.new.some_instance_method

# Output:
# I am a class method on Foo
# I am an instance method on #<Foo:0x00000002b337e0>

ActiveSupport::Concern 只是通过自动包含一个名为的模块来美化它一点ClassMethods并通过运行included块在包含类的上下文中,所以等价的是:

module Mixin
  extend ActiveSupport::Concern

  included do
    some_class_method
  end

  module ClassMethods
    def some_class_method
      puts "I am a class method on #{self.inspect}"
    end
  end

  def some_instance_method
    puts "I am an instance method on #{self.inspect}"
  end
end

class Foo
  include Mixin
end

Foo.new.some_instance_method

# Output:
# I am a class method on Foo
# I am an instance method on #<Foo:0x000000034d7cd8>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ActiveSupport::Concern 功能时,如何通过将“嵌套”模块包含为该类的实例方法来将方法添加到类中? 的相关文章

  • 如何在 ActiveAdmin 中正确配置 Rails 4.1 枚举

    我有一个 Rails 4 1 应用程序 其中使用枚举来表示对象的隐私级别 在我的架构中 t integer privacy level default 0 在我的模型中 enum privacy level privacy private
  • 使用 global-method-security,访问被拒绝错误将作为 HTTP 500 错误返回

    我尝试使用 Spring Security Annotations 来确保安全 而不是在 XML 中定义规则 它似乎有效 但是当我遇到访问被拒绝错误时 我收到返回的 HTTP 状态代码 500 我在 tomcat 日志文件中没有看到任何异常
  • 如何在 Perl 脚本中递归查找文件/文件夹?

    我有一个 perl 脚本 我编写了该脚本来递归地搜索 Windows 文件夹中的文件 我输入搜索文本作为 perl 脚本运行时参数 以查找名称中包含此文本的文件 perl脚本如下 use Cwd file1 ARGV 0 res1 glob
  • 保护客户端 API 的安全

    我正在为基于 JavaScript 的游戏构建服务器端 API 和客户端库 其中必须确保两个非常重要的功能的安全 用户每次游玩都必须扣款 我们必须确保提交的分数是玩家实际获得的分数 解决第一个问题看起来很简单 在每次游戏开始时 我们都会调用
  • 如何使用 Sencha Touch 数据模型读取嵌套 JSON 结构?

    我整个晚上都在试图解决这个问题 但没有成功 我有一个 JSON 结构如下 来自另一个系统 所以我无法更改其结构 parents parent parentId 1 children child childId 1 ch
  • 选择预先选择多个值的标签 - 在数据库中手动插入的值

    我需要在 select tag 中预先选择多个值 但我在空缺表中 手动 添加空缺 如下所示 我的控制器 def create hr curriculum generic HrCurriculumGeneric new params hr c
  • Unit::Test 与 Rspec 之间的区别 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我对感兴趣Test Unit and Rspec 有人可以向我解释一下两者之间的主要区别是什么 就它们的运作原理而言 测试 单位更类似于 JUn
  • 您是否在版本控制中添加公共/资产?

    在rails 3 1中 当您预编译资产时 rails会创建public assets目录并在其中添加文件 你对 public assets 进行版本控制吗 我使用 Capistrano 进行部署 最后一步是编译资产 类似的事情不会被检查到版
  • 使用 webpacker 部署到 heroku 后,资产不存在于资产管道中

    我正在使用 Rails 5 2 3 我可以在本地下载 pdf 但Heroku它通过错误 500 错误是 ActionView Template Error 资源 pdf css 不存在于资源管道中 这是我的 Heroku 日志 2019 0
  • 我可以实施对半取偶吗?

    我需要去做四舍五入到偶数 https en wikipedia org wiki Rounding Round half to even在浮子上 即 如果该值是两个整数之间的中间值 打破平局 y 的小数部分正好是 0 5 则四舍五入到最接近
  • <<-CONSTANT 是做什么的?

    return lt lt HTML li a href some link Link Title a li HTML 第一行的 这是一个异端邪说 http en wikipedia org wiki Here document Ruby h
  • Rails 加载完成后运行代码?

    我有一个定期任务需要每分钟执行一次 使用delayed job 我希望 Rails 在加载完成后立即自动将其排队 如果系统中尚不存在此类任务 对于我来说 在整个 Rails 引导流程结束时运行一些代码的好地方是什么 有人建议 config
  • 从 Restful 身份验证迁移到 Devise

    许多 Rails 2 3 应用程序正在使用 Restful Authentication 但该插件似乎与 Rails 3 存在一些问题 在升级到 Rails 3 时 我一直在使用 Devise 有什么办法可以顺利地从 Restful Aut
  • Capistrano 无法部署到远程服务器

    SOLUTION 解决方案是将以下内容添加到 production rb 的顶部 unshift File expand path lib ENV rvm path Add RVM s lib directory to the load p
  • 如何在 Ruby 数组的所有元素之间插入新元素?

    我有一个数组 想在所有元素之间插入一个新元素 就像join方法 例如 我有 1 333 我需要的是 1 333 请注意 在所有元素之间插入了一个新的空哈希 编辑 目前我所拥有的是 irb main 028 0 gt a 1 333 gt 1
  • Rails 5 api - 未定义的方法“user_url”

    我在 API 模式下使用 Rails 5 启动了一个新项目 目前我只是创建项目 设置数据库并使用脚手架命令 rails g scaffold User 我用邮递员尝试我的代码来创建一个新用户 POST Request URI localho
  • main:Object 的未定义方法“命名空间”(NoMethodError) - 活动记录/rakefile

    我正在尝试运行一个基本的 Sinatra 应用程序 当我进入 机架 步骤时 出现错误 rvm gems ruby 2 2 1 gems activerecord 4 2 1 lib active record railties databa
  • Rails 形式的当前日期

    我正在学习 Rails 并在书外进行一些探索 并随着知识的增长创建一个具有附加功能的简单应用程序 我正在编写一个简单的博客应用程序 我在表单中添加了一个名为 日期 的字段 我不希望这是一个字段 我希望它从服务器获取日期并将其自动放入数据库中
  • gem install libv8 --version '3.11.8.17' on ruby​​ (windows)

    问题如下 Error installing libv8 ERROR Failed to build gem native extension D Ruby193 bin ruby exe extconf rb creating Makefi
  • 设置 put 的行尾字符

    我有一系列想要打印的条目 Being arr数组 我只是用来写 puts arr 然后我需要使用DOS格式的行尾 r n 所以我写道 arr each e print e r n 这工作正常 但我想知道是否有一种方法可以指定要使用的行尾格式

随机推荐

  • 使用 AJAX 时页面不断刷新

    我正在创建一个包含表单的模式框 使用 ajax 和 php 提交后 表单将返回输入 然后模式框应该消失 问题是 结果在框消失和页面刷新之前显示了几秒钟
  • flutter中如何在某个时间执行一个方法?

    如何在固定时间执行一个方法 比如我想在下午 2 30 运行一个方法 我了解计时器功能 但是运行计时器功能这么长时间是个好主意吗 同样 该方法在一天内会被调用多次 Edited 我努力了android alarm manager https
  • R data.table 加速 SI/公制转换

    情况是这样的 我有一个 8500 万行 18 列的表 其中三列的值采用公制前缀 SI 表示法 请参阅公制前缀 http en wikipedia org wiki Metric prefix维基百科上 这意味着我有这样的号码 1M 而不是
  • 访问 <#list> 中对象的属性

    Solution 我之前曾尝试向 LineItem 类添加访问器 例如 public String getItemNo return itemNo 并将 FTL 从 lineItem itemNo to lineItem getItemNo
  • PushStreamContent 流在负载下不会刷新

    我正在使用 PushStreamContent 来保持与每个客户端的持久连接 每 20 秒向每个客户端流推送短心跳消息对于 100 个客户端来说效果很好 但在大约 200 个客户端时 客户端首先开始延迟几秒钟接收 然后根本不显示 我的控制器
  • HighCharts图像导出

    我在我的应用程序中使用 HighChart 我想通过单击按钮导出图表图像http jsfiddle net hfrntt fXHB5 1896 http jsfiddle net hfrntt fXHB5 1896 但我想将图像保存在预定义
  • 无法从 Scrapy 脚本访问 request.response.meta['redirect_urls']

    我无法访问request response meta redirect urls 来自我的 Scrapy 脚本 但在 Scrapy shell 中访问同一网页的此信息没有问题 当我打印钥匙时request response meta我只看到
  • 如何使用 Firebase Cloud Messaging 自动增加 iOS 通知徽章?

    如何使用 Firebase Cloud Messaging 自动增加 iOS 通知徽章 是否可以做类似的事情 1 or 您可以在 通知负载 https firebase google com docs cloud messaging htt
  • Onclick 或 href 最适合在按钮中打开链接

    这是最好的方法 使用按钮打开链接
  • 使用 webdriver python 的触摸事件示例?

    我见过大约100个Java Webdriver 的触摸事件示例 http android developers blogspot com 2011 10 introducing android webdriver html在线 但没有一个P
  • 删除 pandas 数据框中的所有特殊字符

    我无法从 pandas 数据框中删除所有特殊字符 你能帮我吗 我尝试过这样的事情 df df replace r W regex True 因为我在最近的一篇文章中发现了它 但是当我执行时 特殊字符 不会消失 我知道在 PostgresQL
  • Firebase 删除不应该的值

    我正在使用 firebase 编写 Android 应用程序 我有一个部分 用户发送取件请求 该请求显示在司机的请求片段中 为了处理接受 拒绝 我已经设置了它 因此当您单击 接受 时 它会创建另一个包含已接受请求的 Firebase 子项
  • express - Angular2错误:ENOENT:刷新时没有这样的文件或目录

    我有一个公共文件夹 其中放置了 angular2 应用程序 现在我正在尝试设置一个带有始终返回index html 的包罗万象的路由的快速服务器 需要明确的是 根据这个问题 https stackoverflow com questions
  • OCaml 数据类型定义中的方括号“[”和“]”是什么意思?

    I saw 下列 https coq github io doc v8 11 api coq Genarg index html type rlevel type rlevel rlevel 但我以前从未见过这种情况 并且 ADT 代数数据
  • 是否有最近键映射数据结构?

    我遇到一种情况 我需要找到与我请求的键最接近的值 它有点像定义键之间距离的最近地图 例如 如果我在映射中有键 A C M Z 则对 D 的请求将返回 C 的值 任何想法 大多数树数据结构使用某种排序算法来存储和查找键 许多这样的实现可以找到
  • Lollipop中导航栏的默认Alpha值

    如果你设置android windowTranslucentNavigation to true在 Lollipop 主题中 导航栏不会像 KitKat 那样完全半透明 相反 它是一个黑暗的半透明背景 这里有人知道该背景的 alpha 值是
  • Spring WS:如何将拦截器应用到特定端点

    我在 Spring 应用程序上有多个工作 SOAP Web 服务 使用 httpBasic 身份验证 并且我需要在其中之一上使用 WS Security 以允许使用以下 Soap 标头进行身份验证
  • 使用 CSS 排列元素时遇到问题

    我有一个包含链接的无序列表 有些链接是文本 有些是带有图标的文本 但我有一个问题 就是我无法让他们排队 有人可以建议我在这里做错了什么吗 我尝试了不同的组合 但仍然无法让事情排列起来 这是我的 HTML 代码 请注意 我使用了另一个网站的图
  • 构建预配置的 debian 包

    我正在尝试构建一个 debian 软件包 它会自动配置我的所有计算机以使用相同的配置文件和设置 例如 我尝试设置诸如 alter etc default hostapd conf 之类的内容 我目前正在通过使用 dh install 将文件
  • 使用 ActiveSupport::Concern 功能时,如何通过将“嵌套”模块包含为该类的实例方法来将方法添加到类中?

    我正在使用 Ruby 1 9 2 和 Ruby on Rails v3 2 2 gem 在我上一个问题之后使用 Ruby on Rails ActiveSupport Concern 功能时如何 嵌 套 模块的包含 https stacko