gpt4 book ai didi

ruby-on-rails - Railtie 初始化程序未在插件中运行

转载 作者:行者123 更新时间:2023-12-04 07:30:51 26 4
gpt4 key购买 nike

我最近从 resources_controller 的 gem 版本切换了到 plugingem版本依赖 git .

vendor/plugins/plugin/lib/plugin.rb文件,Railtie如下:

module Ardes
module ResourcesController
class Railtie < Rails::Railtie
initializer 'ardes.resources_controller' do
ActiveSupport.on_load(:action_controller) do
extend Ardes::ResourcesController
include Ardes::ResourcesController::RequestPathIntrospection
end

ActiveSupport.on_load(:active_record) do
include Ardes::ActiveRecord::Saved
end
end
end
end
end

我添加了一个 require 'resources_controller'在我的一个初始化程序中,它正在正确加载此文件。问题是,虽然 Railtie被评估(类块中的 puts 将命中),它似乎从未真正调用初始化块本身。这当然很重要,因为这是它扩展的地方 ActionController包括 resources_controller_for方法。

这个问题似乎已经出现 herehere .尽管在这两种情况下,他们都找到了解决问题的其他方法,并且没有直接回答为什么没有调用块。

根据我在 Rails 文档中的说法,您可以将您的初始化程序块命名为您想要的任何名称,并且它应该可以运行。我认为这并不重要,但我在生产环境中运行时首先注意到了这个问题 rails s -e production虽然我相信在开发模式中存在同样的问题。

可能会发生什么?

作为引用,完整的插件在这里: https://github.com/ianwhite/resources_controller

最佳答案

您在这里遇到的问题是,一旦初始化程序开始,您就无法添加新的初始化程序。

在这里,您需要在初始化程序过程中注册初始化程序的代码。当您在 Gemfile 中使用 gems 时,初始值设定项在以下代码中注册:

if defined?(Bundler)
# If you precompile assets before deploying to production, use this line
Bundler.require(*Rails.groups(:assets => %w(development test)))
# If you want your assets lazily compiled in production, use this line
# Bundler.require(:default, :assets, Rails.env)
end

此代码在初始化程序开始之前执行。相反,您需要 resources_controller初始化文件中的代码,该文件在初始化过程中运行。因此,注册新的初始化程序为时已晚。

使情况复杂化的是 vendor/plugins 内部的负载路径也在初始化过程中设置,因此您将无法要求 resources_controllerapplication.rb .

解决您的问题最简单的方法是使用 :path捆绑器中的功能。安装插件后,将此行添加到您的 Gemfile 中:
gem 'resources_controller', :path => "vendor/plugins/resources_controller"

然后,您可以从初始化程序中删除 require 行,bundler 将识别该插件是本地 check out 的 gem,并执行如果您使用 git 会执行的操作。

关于ruby-on-rails - Railtie 初始化程序未在插件中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7422818/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com