11

In meiner Rails-Anwendung habe ich eine Datei sample_data.rb innerhalb /lib/tasks sowie eine Reihe von Testdateien in meinem Verzeichnis /spec.Wohin mit Helferfunktionen für Rake-Aufgaben und Testdateien in Ruby on Rails?

Alle diese Dateien teilen oft eine gemeinsame Funktionalität wie:

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

Wo soll ich diese Hilfsfunktionen setzen? Gibt es eine Art Konvention darüber?

Danke für jede Hilfe!

Antwort

8

Sie könnten eine statische Klasse mit statischen Funktionen erstellen. in etwa so aussehen, dass würde:

class HelperFunctions 

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

    def self.otherFunction 
    end 
end 

Dann alles, was Sie brauchen würde, zu tun ist:

  1. schließen Ihre Hilfsklasse in der Datei, die Sie verwenden möchten
  2. execute es mag:

    HelperFunctions::random_address(anyParametersYouMightHave) 
    

Wenn dies zu tun, stellen Sie sicher, dass Sie umfassen Abhängigkeiten in Ihrer HelperFunctions Klasse.

+0

Danke für Ihre Hilfe! In welches Verzeichnis würden Sie diese Klasse stellen? – Tintin81

+0

Es liegt an dir. Ich würde es wahrscheinlich in das Controller-Verzeichnis einfügen. – BlackHatSamurai

+14

Nein, nicht das Controller-Verzeichnis. Genau deshalb gibt es einen Ordner 'lib'. Der Ordner "app/controllers" sollte nur Controller enthalten. – nathanvda

6

Wenn Sie sicher sind, dass Rake nur spezifisch ist, können Sie auch direkt in RAILS_ROOT/Rakefile hinzufügen (das ist für das von Ihnen verwendete Beispiel wahrscheinlich nicht der Fall).

Ich benutze diese invoke Syntax des Rake zu vereinfachen:

#!/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 

Auf diese Weise ich invoke "my_namespace:my_task" Rake Aufgaben statt Rake::Task[ "my_namespace:my_task" ].invoke verwenden können.

+0

Genau warum bin ich hier gelandet! Wollte wissen, wo ein Wrapper für 'Rake :: Task ['namespace: task'] abgelegt werden soll. Rake :: Task ['namespace: task']. Invoke'. – jibiel

0

Sie teilen Methoden in einem Modul und Sie platzieren ein solches Modul in den Ordner lib.

So etwas wie lib/fake_data.rb

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

    module_function 
end 

und in Ihrer Rake Aufgabe enthält, erfordert nur das Modul, und FakeData.random_address nennen.

Aber wenn es wie ein Seed ist, müssen Sie jedes Mal tun, wenn Sie Ihre Tests ausführen, sollten Sie in Betracht ziehen, dies zu Ihrem allgemeinen before all hinzuzufügen.

z. meine spec_helper sieht wie folgt aus:

und das Modul SetupSupport in spec/support/setup_support.rb definiert ist, und sieht wie folgt aus:

module SetupSupport 

    def load_db_seed 
    load(File.join(Rails.root, 'db', 'seeds.rb')) 
    end 

end 

Nicht sicher, ob Sie die Samen laden müssen, oder tun dies bereits, aber Dies ist der ideale Ort, um auch benötigte gefälschte Daten zu generieren.

Beachten Sie, dass meine Setup-Support-Klasse in spec/support definiert ist, da der Code nur für meine Spezifikationen relevant ist, habe ich keine Rake-Aufgabe, die auch den gleichen Code benötigt.

+0

Damit Ihr 'FakeData'-Modul-Beispielcode funktionieren würde, würde es scheinen, dass die' module_function'-Anweisung eingefügt werden sollte * bevor * die 'random_address'-Funktion definiert wird, anstatt * nach *. – wehal3001