在Ruby on Rails中为rake任务和测试文件放置辅助函数的位置?

Tin*_*n81 12 ruby rake-task ruby-on-rails-3 ruby-on-rails-3.1 ruby-on-rails-3.2

在我的Rails应用程序中,我有一个文件sample_data.rb内部/lib/tasks以及我/spec目录中的一堆测试文件.

所有这些文件通常共享通用功能,例如:

def random_address
  [Faker::Address.street_address, Faker::Address.city].join("\n")
end
Run Code Online (Sandbox Code Playgroud)

我应该把这些辅助功能放在哪里?对此有什么约定吗?

谢谢你的帮助!

Bla*_*rai 8

您可以使用静态函数创建静态类.这看起来像这样:

class HelperFunctions

     def self.random_address
          [Faker::Address.street_address, Faker::Address.city].join("\n")
     end

     def self.otherFunction
     end
end
Run Code Online (Sandbox Code Playgroud)

然后,您需要做的就是:

  1. 在您要使用的文件中包含您的帮助程序类
  2. 执行它像:

    HelperFunctions::random_address(anyParametersYouMightHave)
    
    Run Code Online (Sandbox Code Playgroud)

执行此操作时,请确保在您的HelperFunctions类中包含任何依赖项.

  • Nooooo不是控制器目录.这正是为什么有一个`lib`文件夹的原因.`app/controllers`文件夹应该只包含控制器. (19认同)

kik*_*kik 7

如果您确定它只是特定的rake,您也可以直接添加RAILS_ROOT/Rakefile(对于您使用的示例可能不是这种情况).

我用它来简化rake的invoke语法:

#!/usr/bin/env rake
# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.

require File.expand_path('../config/application', __FILE__)

def invoke( task_name )
  Rake::Task[ task_name ].invoke
end

MyApp::Application.load_tasks
Run Code Online (Sandbox Code Playgroud)

这样,我可以invoke "my_namespace:my_task"在rake任务中使用而不是Rake::Task[ "my_namespace:my_task" ].invoke.