【问题标题】:Is it possible to include modules in rake task and make its methods available for the task in rails app?是否可以在 rake 任务中包含模块并使其方法可用于 rails 应用程序中的任务?
【发布时间】:2013-06-25 17:48:00
【问题描述】:

在我们的rails 3.2.12 应用程序中,在lib/tasks 下创建了一个rake taskrake task 需要调用方法find_config(),该方法位于另一个rails 模块authentify 中(模块不在/lib/ 下)。我们可以在rake task 中的include Authentify 并使find_config() 方法可用于在rake 任务中调用吗?

这是我们想要在rake task 中做的事情:

include Authentify
config = Authentify::find_config()

感谢 cmets。

【问题讨论】:

  • 为什么不创建一个类来包含模块并使用该类调用方法?
  • 需要从 rake 测试中调用的方法必须在模块中调用。该方法在模块中,也被其他代码使用。
  • 您是否真的尝试在 rake 任务中执行 include Authentify 来测试它?你问能不能做。就试一试吧。理论上,从 Ruby 的角度来看,rails 应用程序可以做的任何事情,rake 任务也应该可以访问......我认为。
  • 这就是我要问的。不确定 include 是否会在 rake 测试中工作。还没找到例子。可以试一试,看看是否有效。谢谢。
  • rake 任务返回错误,包括 Authentify::AuthentifyUtility: uninitialized constant Authentify::AuthentifyUtility

标签: ruby-on-rails ruby-on-rails-3 rake


【解决方案1】:
 require 'modules/module_name'

 include ModuleName

 namespace :rake_name do

 desc "description of rake task"

  task example_task: :environment do

   result = ModuleName::method_name()


  end #end task


 end

这对我有用。由于您的模块不在 /lib 中,您可能需要编辑它的要求。但它应该工作。希望对您有所帮助。

【讨论】:

  • 小提示。 require 的工作目录是 lib,所以你不应该在你的路径中包含它。例如,如果您要在 lib/tasks/import/lookup.rb 中导入模块,那么您将使用 require 'tasks/import/lookup'
【解决方案2】:

请注意这一点并避免一些随机的头痛!! .
不要在命名空间之前包含你的模块:

include YourModule
namespace :your_name do
  desc 'Foo'
  task foo: :environment do
  end
end

或在您的命名空间内:

namespace :your_name do
  include YourModule

  desc 'Foo'
  task foo: :environment do
  end
end

因为这将包括您的模块整个应用程序,它可能会给您带来很多麻烦(比如我在模块中添加一些:attr_accessors 并破坏factory-bot 功能或其他东西由于同样的原因,它在过去发生过)。
“没有问题”的方式在您的任务范围内:

namespace :your_name do
  desc 'Foo'
  task foo: :environment do
    include YourModule
  end
end

是的,如果你有多个任务,你应该在每个任务中包括:

namespace :your_name do
  desc 'Foo'
  task foo: :environment do
    include YourModule
  end

  desc 'Bar'
  task bar: :environment do
    include YourModule
  end
end

如果您只在任务中调用一次方法,则直接调用您的方法:

namespace :your_name do
  desc 'Foo'
  task foo: :environment do
    YourModule.your_method
  end

  desc 'Bar'
  task bar: :environment do
    YourModule.your_method
  end
end

【讨论】:

    【解决方案3】:

    如何在 Rake 任务中要求 Rails 服务/模块?

    我遇到了同样的问题,并设法通过在 rake 任务中要求 rails 文件来解决它。

    我在文件 lib/tasks/a_task.rake 中定义了一个名为 give_something 的 rake 任务。

    在该任务中,我需要从位于文件app/services/a_service.rb 中的模块AService 调用函数give_something

    rake任务定义如下:

    namespace :a_namespace do
      desc "give something to a list of users"
      task give_something: :environment do
    
        AService.give_something(something, users)
    
      end
    end
    

    我收到了错误:uninitialized constant AService

    为了解决这个问题,我必须在文件 a_task.rake 的开头而不是在 rake 任务中要求模块:

    namespace :a_namespace do
      desc "give something to a list of users"
      task give_something: :environment do
    
        require 'services/a_service' # <-- HERE!
        AService.give_something(something, users)
    
      end
    end
    

    【讨论】:

      【解决方案4】:

      在 rails 5.x.x 中我们可以这样做-

      模块文件存在她app/lib/module/sub_module.rblike-

      module Module
        module SubModule
      
          def self.method(params1, params2)
            // code goes here...
          end
      
        end
      end
      

      我的 rake_task 在这里展示 /lib/tasks/my_tasks.rake as-

      namespace :my_tasks do
        desc "TODO"
        task :task_name => :environment do
          Module::SubModule.my_method(params1, params2)
        end
      end
      

      注意:- 上述任务文件在外部库中而不是在 app/lib 中 现在使用以下命令运行任务-

      rake my_tasks:task_name
      

      来自应用目录而不是来自rails console

      这对我有用!!!

      【讨论】:

      • 你真的叫模块Module吗?我收到一条错误消息,提示 Module is not a module
      猜你喜欢
      • 1970-01-01
      • 2017-01-01
      • 2020-09-07
      • 2012-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      相关资源
      最近更新 更多