Heroku上的Rails:NameError:未初始化的常量ApplicationPolicy

时间:2017-09-17 01:02:45

标签: ruby-on-rails heroku pundit

在将我的Rails API应用程序部署到Heroku时,我的构建失败并出现以下错误:

-----> Detecting rake tasks
sh: 2: Syntax error: Unterminated quoted string
sh: 2: Syntax error: Unterminated quoted string
 !
 !     Could not detect rake tasks
 !     ensure you can run `$ bundle exec rake -P` against your app
 !     and using the production group of your Gemfile.
 !     rake aborted!
 !     NameError: uninitialized constant ApplicationPolicy
/tmp/build_64dbe116b1bd38f520ae98d49690e476/sdotapi-86210153dc2b588aa7b0dc9a60799f5090c76f46/app/policies/user_setting_policy.rb:1:in `<top (required)>'

现在,问题是我在本地开发框中看不到此NameError错误。这似乎表明,我的Pundit政策的路径不会在Heroku上加载,而是发生在本地方框上。但我不确定原因:

以下是application.rb的相关部分:

config.autoload_paths << Rails.root.join('lib')
Dir[Rails.root.join('app/policies/*.rb')].each &method(:require)

错误所在的行:

class UserSettingPolicy < ApplicationPolicy

这两个政策文件都位于app/policies

任何有关可能发生的事情的想法都会受到超级赞赏!

1 个答案:

答案 0 :(得分:1)

最终发现问题。策略文件在上面的代码中逐个加载,因此必须将其更改为下面的Rails,以便立即加载整个目录。

config.autoload_paths += Dir[Rails.root.join('app', 'policies', '*.rb')]
# earlier it was Dir[Rails.root.join('app/policies/*.rb')].each &method(:require)

另一方面,config/application.rb中的上述行最终成为:

config.autoload_paths += Dir[
    Rails.root.join('app', 'policies', '*.rb'),
    Rails.root.join('app', 'lib', '*.rb')
]

请注意lib的更改,因为Rails 5中的自动加载更改。有关详细信息,请参阅此处:https://stackoverflow.com/a/40019108