11

Nella mia applicazione Rails ho un file sample_data.rb all'interno di /lib/tasks e un mucchio di file di test nella mia directory /spec.Dove mettere le funzioni di supporto per le attività rake e testare i file in Ruby on Rails?

Tutti questi file spesso condividono funzionalità comuni come ad esempio:

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

Dove devo mettere quelle funzioni di aiuto? C'è una sorta di convenzione su questo?

Grazie per qualsiasi aiuto!

risposta

8

È possibile creare una classe statica, con funzioni statiche. Che qualcosa sarebbe simile a questa:

class HelperFunctions 

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

    def self.otherFunction 
    end 
end 

Poi, tutto quello che avrebbe bisogno di fare è:

  1. Includi la tua classe di supporto nel file che si desidera utilizzare
  2. eseguirlo piace:

    HelperFunctions::random_address(anyParametersYouMightHave) 
    

Nel fare questo, assicuratevi di includere eventuali dipendenze nella classe HelperFunctions.

+0

Grazie per il vostro aiuto! In quale directory metteresti quella classe? – Tintin81

+0

Sta a te. Probabilmente lo inserirò nella directory del controller. – BlackHatSamurai

+14

Nooooo non la directory del controller. Questo è esattamente il motivo per cui esiste una cartella 'lib'. La cartella 'app/controller 'dovrebbe contenere solo controller. – nathanvda

6

Se si è sicuri che il rake sia solo specifico, è anche possibile aggiungere direttamente in RAILS_ROOT/Rakefile (che probabilmente non è il caso per l'esempio che si utilizza).

Io lo uso per semplificare la sintassi invoke del rake:

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

In questo modo, posso usare invoke "my_namespace:my_task" in compiti rake invece di Rake::Task[ "my_namespace:my_task" ].invoke.

+0

Esattamente perché sono finito qui! Volevo sapere dove mettere un wrapper per 'Rake :: Task ['namespace: task']. Reenable; Rake :: Task. [ 'Namespace: operazione'] invoke'. – jibiel

0

Si condividono i metodi in un modulo e si inserisce tale modulo nella cartella lib.

Qualcosa di simile lib/fake_data.rb contenente

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

    module_function 
end 

e dentro il vostro compito rake richiedono solo il modulo, e chiamare FakeData.random_address.

Ma, se è come un seme che devi fare ogni volta che esegui i test, dovresti considerare di aggiungere questo al tuo generale before all.

E.g. il mio spec_helper assomiglia a questo:

e il modulo SetupSupport è definito in spec/support/setup_support.rb e si presenta come segue:

module SetupSupport 

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

end 

Non sono sicuro se è necessario caricare i semi, o lo stanno già facendo, ma questo è il posto ideale per generare anche dati falsi necessari.

Si noti che la mia classe di supporto di installazione è definita in spec/support perché il codice è rilevante solo per le mie specifiche, non ho attività rake che richiede lo stesso codice.

+0

per far funzionare il codice di esempio del modulo 'FakeData', sembrerebbe che l'istruzione' module_function' debba essere inserita * prima * che definisca la funzione 'random_address', anziché * dopo *. – wehal3001