在将我的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
。
任何有关可能发生的事情的想法都会受到超级赞赏!
答案 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