繁体   English   中英

Rails中的Ruby类扩展在本地声明时有效,从`/ lib /`导入时返回`nil`。

Ruby class extension in Rails works when declared locally, returns `nil` when imported from `/lib/`

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

TLDR:哈希扩展程序可以完美地工作,当将其本地包含在我的Mailer中时,可以返回所需的输出,但是,即使成功加载了类方法,从lib/的模块导入时,它也始终返回nil

当我在类定义之前在mailer.rb文件中声明扩展名时,如下所示:

class Hash
  def try_deep(*fields)
    ...
  end
end

class MyMailer < ApplicationMailer
  some_hash.try_deep(:some_key)
end

它可以完美地工作,但这是不好的做法。 我认为最好在/lib/core_ext/hash/try_deep.rb声明扩展名,然后在Mailer中要求它,如下所示:

/lib/core_ext/hash/try_deep.rb:

module CoreExtensions
  module Hash
    module TryDeep
      def try_deep(*fields)
        ...
      end
    end
  end
end

/my_mailer.rb:

require 'core_ext/hash/try_deep'

class MyMailer < ApplicationMailer
  Hash.include CoreExtensions::Hash::TryDeep
  some_hash.try_deep(:some_key)
end
1 个回复

您需要在类之外将自定义方法注入到Hash中:

my_mailer.rb

require 'core_ext/hash/try_deep'

class Hash
  include CoreExtensions::Hash::TryDeep
end

class MyMailer < ApplicationMailer
  some_hash.try_deep(:some_key)
end
5 水星:此谓词在顶层声明时有效,但不能作为lambda声明

(以下摘录来自该测试套件 ,它是此处找到的两个文件程序的一半。) 我用两种方式定义了一个辅助谓词:一次是在顶层(称为helper ),一次是作为lambda(称为Helper )。 在下面的代码的最后三行中,我使用了该辅助谓词。 如果使用helper程序,则可以使用,但是如果使用Hel ...

9 React hooks 小部件在直接使用时有效,但在从 NPM 导入时无效

我有一个简单的 React Hooks 小部件示例,其功能是提供上下文挂钩以提供可以设置一些字符串和切换当前 Material UI 主题的状态。 这是工作演示。 通过单击标记为“下一个主题”的按钮,您可以看到页面在黄色和蓝色之间切换,以及一些指示主题名称的文本更改。 这是一个人为的例子,但我的想 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM