【问题标题】:Nested Helpers Issue嵌套助手问题
【发布时间】:2021-07-10 03:05:21
【问题描述】:

我正在尝试将旧版应用程序从 3 迁移到 4(当然接下来我会转到 5 和 6)。基本上它是一个helper重的app,它封装了很多helpers上的逻辑。

我在 Rails 4 上加载助手时遇到了一些问题,我想我已经解决了,但我似乎遇到了嵌套助手的问题。我正在使用 traceroute gem 来验证 routes.rb 上的路由是否正常工作,并且我遇到了一些问题。

例子:

uninitialized constant Permissions
/home/app/helpers/permissions/charts_helper.rb:1:in `<top (required)>'

图表助手(app/helpers/permissions/charts_helper.rb)

module Permissions::ChartsHelper

  ...

end

application.rb上导入助手:

   config.autoload_paths << Rails.root.join('lib')
   # config.autoload_paths += Dir["#{config.root}/app/helpers/**/"]
   Dir["#{config.root}/app/models/concerns/**/*.rb"].each { |file| require file[0..-4]}
   Dir["#{config.root}/app/helpers/**/*.rb"].each { |file| require file[0..-4]}

(我不得不注释掉第二行以支持第四行,它似乎导入了一些助手但不是全部)

所以基本上我正在寻找:

1.) 在 applications.rb 文件中包含这些帮助程序的最佳方式 2.) 让助手工作 3.) 任何可以帮助我前进的最佳实践或其他建议。

【问题讨论】:

标签: ruby-on-rails ruby ruby-on-rails-4


【解决方案1】:
module Permissions
  module ChartsHelper
    # ...
  end
end

使用显式定义(并重新打开)命名空间的类和模块 嵌套。使用范围解析运算符可能会导致令人惊讶的 由于 Ruby 的词法作用域,不断查找,这取决于 在定义点嵌套模块。
- the Ruby Style Guide

使用:: 不是显式嵌套的简写,它需要先加载权限以避免丢失常量错误。

module Permissions::ChartsHelper
end
# NameError (uninitialized constant Permissions)

它还设置了错误的模块嵌套:

FOO = "I'm in the global scope"

module Permissions
  FOO = "I'm Permissions::FOO"
end

module Permissions::ChartsHelper
  puts FOO # I'm in the global scope
  puts Module.nesting.inspect # [Permissions::ChartsHelper]
end

在 Ruby 中,只有 moduleclass 关键字会更改当前的模块嵌套。 相比之下,如果您显式嵌套模块:

FOO = "I'm in the global scope"

module Permissions
  FOO = "I'm Permissions::FOO"
end

module Permissions
  module ChartsHelper
    puts FOO # I'm Permissions::FOO
    puts Module.nesting.inspect # [Permissions::ChartsHelper, Permissions]
  end
end

【讨论】:

    猜你喜欢
    • 2013-05-10
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多