11

Trong ứng dụng Rails của tôi, tôi có một tập tin sample_data.rb bên trong /lib/tasks cũng như một loạt các tệp thử nghiệm bên trong thư mục /spec của tôi.Nơi đặt các hàm trợ giúp cho các tác vụ rake và kiểm tra các tệp trong Ruby on Rails?

Tất cả những tập tin này thường chia sẻ chức năng phổ biến như:

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

tôi nên đặt những chức năng helper ở đâu? Có một số loại quy ước về điều này?

Cảm ơn bạn đã trợ giúp!

Trả lời

8

Bạn có thể tạo một lớp tĩnh, với các hàm tĩnh. Điều đó sẽ giống như thế này:

class HelperFunctions 

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

    def self.otherFunction 
    end 
end 

Sau đó, tất cả các bạn sẽ cần phải làm là:

  1. bao gồm lớp helper của bạn trong file bạn muốn sử dụng
  2. execute nó thích:

    HelperFunctions::random_address(anyParametersYouMightHave) 
    

Khi thực hiện việc này, hãy đảm bảo bạn bao gồm mọi phụ thuộc trong lớp học HelperFunctions của bạn.

+0

Cảm ơn sự giúp đỡ của bạn! Trong thư mục nào bạn sẽ đặt lớp đó? – Tintin81

+0

Tùy thuộc vào bạn. Tôi có thể đặt nó trong thư mục điều khiển. – BlackHatSamurai

+14

Nooooo không phải là thư mục điều khiển. Đây chính là lý do tại sao có một thư mục 'lib'. Thư mục 'app/controllers' chỉ nên chứa các bộ điều khiển. – nathanvda

6

Nếu bạn chắc chắn rằng nó chỉ cào cụ thể, bạn cũng có thể thêm trực tiếp vào RAILS_ROOT/Rakefile (có thể không phải là trường hợp cho ví dụ bạn sử dụng).

Tôi sử dụng này để đơn giản hóa cú pháp invoke cào của:

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

Bằng cách đó, tôi có thể sử dụng trong các nhiệm vụ invoke "my_namespace:my_task" cào thay vì Rake::Task[ "my_namespace:my_task" ].invoke.

+0

Chính xác lý do tôi kết thúc ở đây! Muốn biết nơi để đặt một wrapper cho 'Rake :: Task ['namespace: task']. Reenable; Rake :: Tác vụ ['không gian tên: nhiệm vụ']. – jibiel

0

Bạn chia sẻ phương thức trong mô-đun và bạn đặt mô-đun như vậy trong thư mục lib.

Something như lib/fake_data.rb chứa

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

    module_function 
end 

và bên trong nhiệm vụ cào bạn chỉ cần mô-đun, và gọi FakeData.random_address.

Nhưng, nếu giống như hạt giống bạn cần làm mỗi khi bạn chạy thử nghiệm, bạn nên cân nhắc việc thêm số này vào số chung before all.

Ví dụ: spec_helper của tôi trông như thế này:

và các mô-đun SetupSupport được định nghĩa trong spec/support/setup_support.rb và trông như sau:

module SetupSupport 

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

end 

Không chắc chắn nếu bạn cần phải tải những hạt giống, hoặc đã làm điều này, nhưng đây là nơi lý tưởng để tạo ra dữ liệu giả mạo cần thiết.

Lưu ý rằng lớp hỗ trợ thiết lập của tôi được xác định trong spec/support vì mã chỉ liên quan đến thông số kỹ thuật của tôi, tôi không có tác vụ cào cũng cần có cùng mã.

+0

để làm cho mã ví dụ mô-đun 'FakeData' của bạn hoạt động, nó sẽ xuất hiện câu lệnh' module_function' sẽ được chèn * trước * định nghĩa hàm 'random_address', thay vì * sau *. – wehal3001

Các vấn đề liên quan